Modify metadata
This commit is contained in:
		| @@ -64,7 +64,10 @@ postBookMetaHandler auth PostBook{..} = flip requireLoggedIn auth $ \SafeUser{us | ||||
|  | ||||
|  | ||||
| putBookMetaHandler :: AuthResult SafeUser -> BookID -> JsonBook -> AppM JsonBook | ||||
| putBookMetaHandler _ _ _ = throwM err403 | ||||
| putBookMetaHandler auth bookId b@JsonBook{..} | ||||
|   | bookId == identifier = flip requireLoggedIn auth $ \SafeUser{username=owner} -> | ||||
|         maybe (throwM err403) (const (return b)) =<< runDB (updateBook UpdateBook{..}) | ||||
|   | otherwise = throwM err403 | ||||
|  | ||||
| listBooksHandler :: AuthResult SafeUser -> AppM [JsonBook] | ||||
| listBooksHandler = requireLoggedIn $ \user -> do | ||||
|   | ||||
| @@ -1,9 +1,12 @@ | ||||
| {-# Language TypeApplications #-} | ||||
| {-# Language DataKinds #-} | ||||
| {-# Language DuplicateRecordFields #-} | ||||
| module Database.Book | ||||
|   ( def | ||||
|   , insertBook | ||||
|   , updateBook | ||||
|   , InsertBook(..) | ||||
|   , UpdateBook(..) | ||||
|   , usersBooks | ||||
|   , Book(..) | ||||
|   , BookID) where | ||||
| @@ -39,3 +42,27 @@ insertBook InsertBook{..} = do | ||||
|   forM (listToMaybe mUserId) $ \userId -> do | ||||
|     let book = Book{owner=userId,identifier=def,contentHash=Nothing,..} | ||||
|     BookID . fromRowId <$> insertGenWithPK books [book] | ||||
|  | ||||
| data UpdateBook = UpdateBook { identifier :: BookID | ||||
|                              , contentType :: Text | ||||
|                              , title :: Maybe Text | ||||
|                              , description :: Maybe Text | ||||
|                              , owner :: Username } | ||||
|  | ||||
| updateBook :: (MonadSelda m, MonadMask m, MonadIO m) => UpdateBook -> m (Maybe UpdateBook) | ||||
| updateBook book@UpdateBook{..} = do | ||||
|   mUserId <- query $ do | ||||
|     userId :*: _ :*: username :*: _ <- select (gen users) | ||||
|     bookId :*: _ :*: _ :*: _ :*: _ :*: bookOwner <- select (gen books) | ||||
|     restrict (userId .== bookOwner) | ||||
|     restrict (username .== literal owner) | ||||
|     restrict (bookId .== literal identifier) | ||||
|     return userId | ||||
|   forM (listToMaybe mUserId) $ \_userId -> do | ||||
|     update_ (gen books) predicate (\b -> b `with` [ pContentType := literal contentType | ||||
|                                                   , pTitle := literal title | ||||
|                                                   , pDescription := literal description ]) | ||||
|     return book | ||||
|   where | ||||
|     _ :*: _ :*: pContentType :*: pTitle :*: pDescription :*: _ = selectors (gen books) | ||||
|     predicate (bookId :*: _) = bookId .== literal identifier | ||||
|   | ||||
| @@ -42,7 +42,7 @@ instance SqlType Username where | ||||
|  | ||||
| newtype UserID = UserID {unUserID :: Int} deriving (Show) | ||||
|  | ||||
| newtype BookID = BookID {unBookID :: Int} deriving (Show, ToJSON, FromJSON, FromHttpApiData) | ||||
| newtype BookID = BookID {unBookID :: Int} deriving (Show, ToJSON, FromJSON, FromHttpApiData, Eq, Ord) | ||||
|  | ||||
| newtype ChannelID = ChannelID {unChannelID :: Int} deriving (Show) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user