Rename more stuff
This commit is contained in:
139
advanced/part1/src/Article/Comment.elm
Normal file
139
advanced/part1/src/Article/Comment.elm
Normal file
@@ -0,0 +1,139 @@
|
||||
module Article.Comment
|
||||
exposing
|
||||
( Comment
|
||||
, author
|
||||
, body
|
||||
, createdAt
|
||||
, delete
|
||||
, id
|
||||
, list
|
||||
, post
|
||||
)
|
||||
|
||||
import Api
|
||||
import Article exposing (Article)
|
||||
import Article.Slug as Slug exposing (Slug)
|
||||
import Author exposing (Author)
|
||||
import CommentId exposing (CommentId)
|
||||
import Http
|
||||
import HttpBuilder exposing (RequestBuilder, withExpect, withQueryParams)
|
||||
import Json.Decode as Decode exposing (Decoder)
|
||||
import Json.Decode.Pipeline exposing (custom, required)
|
||||
import Json.Encode as Encode exposing (Value)
|
||||
import Profile exposing (Profile)
|
||||
import Time
|
||||
import Timestamp
|
||||
import Viewer exposing (Viewer)
|
||||
import Viewer.Cred as Cred exposing (Cred)
|
||||
|
||||
|
||||
|
||||
-- TYPES
|
||||
|
||||
|
||||
type Comment
|
||||
= Comment Internals
|
||||
|
||||
|
||||
type alias Internals =
|
||||
{ id : CommentId
|
||||
, body : String
|
||||
, createdAt : Time.Posix
|
||||
, author : Author
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- INFO
|
||||
|
||||
|
||||
id : Comment -> CommentId
|
||||
id (Comment comment) =
|
||||
comment.id
|
||||
|
||||
|
||||
body : Comment -> String
|
||||
body (Comment comment) =
|
||||
comment.body
|
||||
|
||||
|
||||
createdAt : Comment -> Time.Posix
|
||||
createdAt (Comment comment) =
|
||||
comment.createdAt
|
||||
|
||||
|
||||
author : Comment -> Author
|
||||
author (Comment comment) =
|
||||
comment.author
|
||||
|
||||
|
||||
|
||||
-- LIST
|
||||
|
||||
|
||||
list : Maybe Cred -> Slug -> Http.Request (List Comment)
|
||||
list maybeCred articleSlug =
|
||||
allCommentsUrl articleSlug []
|
||||
|> HttpBuilder.get
|
||||
|> HttpBuilder.withExpect (Http.expectJson (Decode.field "comments" (Decode.list (decoder maybeCred))))
|
||||
|> Cred.addHeaderIfAvailable maybeCred
|
||||
|> HttpBuilder.toRequest
|
||||
|
||||
|
||||
|
||||
-- POST
|
||||
|
||||
|
||||
post : Slug -> String -> Cred -> Http.Request Comment
|
||||
post articleSlug commentBody cred =
|
||||
allCommentsUrl articleSlug []
|
||||
|> HttpBuilder.post
|
||||
|> HttpBuilder.withBody (Http.jsonBody (encodeCommentBody commentBody))
|
||||
|> HttpBuilder.withExpect (Http.expectJson (Decode.field "comment" (decoder (Just cred))))
|
||||
|> Cred.addHeader cred
|
||||
|> HttpBuilder.toRequest
|
||||
|
||||
|
||||
encodeCommentBody : String -> Value
|
||||
encodeCommentBody str =
|
||||
Encode.object [ ( "comment", Encode.object [ ( "body", Encode.string str ) ] ) ]
|
||||
|
||||
|
||||
|
||||
-- DELETE
|
||||
|
||||
|
||||
delete : Slug -> CommentId -> Cred -> Http.Request ()
|
||||
delete articleSlug commentId cred =
|
||||
commentUrl articleSlug commentId
|
||||
|> HttpBuilder.delete
|
||||
|> Cred.addHeader cred
|
||||
|> HttpBuilder.toRequest
|
||||
|
||||
|
||||
|
||||
-- SERIALIZATION
|
||||
|
||||
|
||||
decoder : Maybe Cred -> Decoder Comment
|
||||
decoder maybeCred =
|
||||
Decode.succeed Internals
|
||||
|> required "id" CommentId.decoder
|
||||
|> required "body" Decode.string
|
||||
|> required "createdAt" Timestamp.iso8601Decoder
|
||||
|> required "author" (Author.decoder maybeCred)
|
||||
|> Decode.map Comment
|
||||
|
||||
|
||||
|
||||
-- URLS
|
||||
|
||||
|
||||
commentUrl : Slug -> CommentId -> String
|
||||
commentUrl articleSlug commentId =
|
||||
allCommentsUrl articleSlug [ CommentId.toString commentId ]
|
||||
|
||||
|
||||
allCommentsUrl : Slug -> List String -> String
|
||||
allCommentsUrl articleSlug paths =
|
||||
Api.url ([ "articles", Slug.toString articleSlug, "comments" ] ++ paths)
|
||||
Reference in New Issue
Block a user