module Sound.Freesound.User (
User(..)
, Avatar(..)
, getUserByName
) where
import Control.Monad (join)
import Data.Aeson (FromJSON(..), Value(..), (.:), (.:?))
import Data.Text (Text)
import Sound.Freesound.API (Freesound, Resource, URI, get, resourceURI)
import Sound.Freesound.Bookmark (BookmarkCategory)
import Sound.Freesound.List (List)
import Sound.Freesound.Pack (Pack)
import qualified Sound.Freesound.Sound as Sound
import Sound.Freesound.Time
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative
#endif
data Avatar = Avatar {
small :: URI
, medium :: URI
, large :: URI
} deriving (Eq, Show)
instance FromJSON Avatar where
parseJSON (Object v) =
Avatar <$> v .: "small"
<*> v .: "medium"
<*> v .: "large"
parseJSON _ = fail "Couldn't parse Avatar"
data User = User {
url :: URI
, username :: Text
, about :: Maybe Text
, homepage :: Maybe URI
, avatar :: Maybe Avatar
, dateJoined :: UTCTime
, numSounds :: Int
, sounds :: Resource (List Sound.Summary)
, numPacks :: Int
, packs :: Resource (List Pack)
, numPosts :: Int
, numComments :: Int
, bookmarkCategories :: Resource (List BookmarkCategory)
} deriving (Eq, Show)
instance FromJSON User where
parseJSON (Object v) =
User
<$> v .: "url"
<*> v .: "username"
<*> (join <$> (v .:? "about"))
<*> (join <$> (v .:? "homepage"))
<*> (join <$> (v .:? "avatar"))
<*> (toUTCTime <$> (v .: "date_joined"))
<*> v .: "num_sounds"
<*> v .: "sounds"
<*> v .: "num_packs"
<*> v .: "packs"
<*> v .: "num_posts"
<*> v .: "num_comments"
<*> v .: "bookmark_categories"
parseJSON _ = fail "Couldn't parse User"
getUserByName :: Text -> Freesound User
getUserByName u = get $ resourceURI [ "users", u ] []