on master help sign in
Resolved #1
commitda4afd745c8d321ecfdbec76b4c4d29cfdfefb88 authoriko <ilyakooo0@gmail.com> dateWed 27 Feb 2019, 19:08 (8 years ago) parent4f0da78
4 files changed+45−28
denis/src/Data/Post.hs+8−4 denis/src/Data/PostElement.hs+7−6 denis/src/Data/Query.hs+18−18 denis/src/Data/Schema.hs+12
denis/src/Data/Post.hs+8−4
@@ -84,13 +84,17 @@ postToRow :: Post -> PostRow
8484postToRow (PostData pId aId _) = PostRow pId aId
8585
8686postToElementRows :: PostData p -> [ElementRow (PostData p)]
87−postToElementRows (PostData pId _ pb) = elementsToRows pId pb
87+postToElementRows (PostData pId uId pb) = elementsToRows pId uId pb
8888
89−rowsToPost :: M.Map Int64 [ElementRow PostQuote] -> M.Map Int64 PostQuoteRow -> PostRow -> [ElementRow (PostData p)] -> Maybe (PostData p)
90−rowsToPost erqs pqrs (PostRow pId aId) elementRows = PostData pId aId <$> rowsToElements erqs pqrs elementRows
89+rowsToPost :: M.Map Int64 [ElementRow PostQuote] -> M.Map Int64 PostQuoteRow -> [ElementRow (PostData p)] -> Maybe (PostData p)
90+rowsToPost erqs pqrs [] = Nothing
91+rowsToPost erqs pqrs elementRows = let
92+ pId = rowElementId . head $ elementRows
93+ uId = rowElementAuthorId . head $ elementRows
94+ in PostData pId uId <$> rowsToElements erqs pqrs elementRows
9195
9296fromDraft :: PostId -> ElementRow Draft -> ElementRow Post
93−fromDraft pId (ElementRow _ b c d e f g) = ElementRow pId b c d e f g
97+fromDraft pId (ElementRow _ uId b c d e f g) = ElementRow pId uId b c d e f g
9498
9599-- tupleFirst :: (a -> b) -> a -> (b, a)
96100-- tupleFirst f a = (f a, a)
denis/src/Data/PostElement.hs+7−6
@@ -48,6 +48,7 @@ data PostElement a = Markdown Text
4848
4949data ElementRow a = ElementRow {
5050 rowElementId :: Int64, -- the source id
51+ rowElementAuthorId :: Int64,
5152 rowElementOrd :: Int64,
5253 rowElementMarkdown :: Maybe Text,
5354 rowElementLatex :: Maybe Text,
@@ -82,16 +83,16 @@ rowsToElements :: M.Map Int64 [ElementRow PostQuote] -> M.Map Int64 PostQuoteRow
8283rowsToElements erqs pqrs = traverse elementRowToElement . sortBy (compare `on` rowElementOrd)
8384 where
8485 elementRowToElement :: ElementRow a -> Maybe (PostElement a)
85− elementRowToElement (ElementRow _ _ (Just m) Nothing Nothing Nothing Nothing) = Just $ Markdown m
86− elementRowToElement (ElementRow _ _ Nothing (Just l) Nothing Nothing Nothing) = Just $ Latex l
87− elementRowToElement (ElementRow _ _ Nothing Nothing (Just i) Nothing Nothing) = Just $ Image i
86+ elementRowToElement (ElementRow _ _ _ (Just m) Nothing Nothing Nothing Nothing) = Just $ Markdown m
87+ elementRowToElement (ElementRow _ _ _ Nothing (Just l) Nothing Nothing Nothing) = Just $ Latex l
88+ elementRowToElement (ElementRow _ _ _ Nothing Nothing (Just i) Nothing Nothing) = Just $ Image i
8889 -- elementRowToElement (ElementRow _ _ Nothing Nothing Nothing (Just q) Nothing) =
8990 -- fmap Quote $ M.lookup q pqrs >>= rowsToQuote erqs pqrs
90− elementRowToElement (ElementRow _ _ Nothing Nothing Nothing Nothing (Just a)) = Just $ Attachment a
91+ elementRowToElement (ElementRow _ _ _ Nothing Nothing Nothing Nothing (Just a)) = Just $ Attachment a
9192 elementRowToElement _ = Nothing
9293
93−elementsToRows :: Int64 -> [PostElement p] -> [ElementRow p]
94−elementsToRows pId pb = map (uncurry finish) $ flip zip pb $ ElementRow pId <$> [0..]
94+elementsToRows :: Int64 -> Int64 -> [PostElement p] -> [ElementRow p]
95+elementsToRows pId uId pb = map (uncurry finish) $ flip zip pb $ ElementRow pId uId <$> [0..]
9596 where finish :: (Maybe Text -> Maybe Text -> Maybe Text -> Maybe Int64 -> Maybe Text -> ElementRow p) -> PostElement p -> ElementRow p
9697 finish f pe = case pe of
9798 Markdown m -> f (Just m) Nothing Nothing Nothing Nothing
denis/src/Data/Query.hs+18−18
@@ -69,9 +69,8 @@ getDraftElementsQ = selectStar $ from (table #draftElements) & where_ (#rowEleme
6969
7070getPost :: PostId -> StaticPQ (Maybe Post)
7171getPost pId = do
72− postRow <- runQueryParams getPostRowQ (Only pId) >>= getRow 0
7372 postRowElements <- runQueryParams getPostElementsQ (Only pId) >>= getRows
74− return $ rowsToPost M.empty M.empty postRow postRowElements
73+ return $ rowsToPost M.empty M.empty postRowElements
7574
7675getLastPostRowsQ :: Word64 -> Query Schema '[] (RowPG (Only PostId))
7776getLastPostRowsQ n = select (#postRowId `as` #fromOnly) $
@@ -103,28 +102,30 @@ createPostRowQ = insertRow #posts
103102createDraftElementRowsQ :: Manipulation Schema (TuplePG (ElementRow Draft)) '[]
104103createDraftElementRowsQ = insertRow_ #draftElements
105104 (Set (param @1) `as` #rowElementId :*
106− Set (param @2) `as` #rowElementOrd :*
107− Set (param @3) `as` #rowElementMarkdown :*
108− Set (param @4) `as` #rowElementLatex :*
109− Set (param @5) `as` #rowElementImage :*
110− Set (param @6) `as` #rowElementQuote :*
111− Set (param @7) `as` #rowElementAttachment)
105+ Set (param @2) `as` #rowElementAuthorId :*
106+ Set (param @3) `as` #rowElementOrd :*
107+ Set (param @4) `as` #rowElementMarkdown :*
108+ Set (param @5) `as` #rowElementLatex :*
109+ Set (param @6) `as` #rowElementImage :*
110+ Set (param @7) `as` #rowElementQuote :*
111+ Set (param @8) `as` #rowElementAttachment)
112112
113113createPostElementRowsQ :: Manipulation Schema (TuplePG (ElementRow Post)) '[]
114114createPostElementRowsQ = insertRow_ #postElements
115115 (Set (param @1) `as` #rowElementId :*
116− Set (param @2) `as` #rowElementOrd :*
117− Set (param @3) `as` #rowElementMarkdown :*
118− Set (param @4) `as` #rowElementLatex :*
119− Set (param @5) `as` #rowElementImage :*
120− Set (param @6) `as` #rowElementQuote :*
121− Set (param @7) `as` #rowElementAttachment)
116+ Set (param @2) `as` #rowElementAuthorId :*
117+ Set (param @3) `as` #rowElementOrd :*
118+ Set (param @4) `as` #rowElementMarkdown :*
119+ Set (param @5) `as` #rowElementLatex :*
120+ Set (param @6) `as` #rowElementImage :*
121+ Set (param @7) `as` #rowElementQuote :*
122+ Set (param @8) `as` #rowElementAttachment)
122123
123124createDraft :: UserId -> [PostElement Draft] -> StaticPQ Draft
124125createDraft uId els = transactionally_ $ do
125126 dId' <- manipulateParams createDraftRowQ (Only uId)
126127 dId <- lift $ fromOnly <$> getRow 0 dId'
127− traversePrepared_ createDraftElementRowsQ $ elementsToRows dId els
128+ traversePrepared_ createDraftElementRowsQ $ elementsToRows dId uId els
128129 return $ mkDraft dId uId els
129130
130131getDraftsForUserQ :: Query Schema (TuplePG (Only UserId)) (RowPG (Only DraftId))
@@ -147,9 +148,8 @@ getPostsForUser lim uId = do
147148
148149getDraft :: DraftId -> StaticPQ (Maybe Draft)
149150getDraft dId = do
150− draftRow <- runQueryParams getDraftRowQ (Only dId) >>= getRow 0
151151 draftRowElements <- runQueryParams getDraftElementsQ (Only dId) >>= getRows
152− return $ rowsToPost M.empty M.empty draftRow draftRowElements
152+ return $ rowsToPost M.empty M.empty draftRowElements
153153
154154getDrafts :: UserId -> StaticPQ [Draft]
155155getDrafts uId = do
@@ -175,7 +175,7 @@ updateDraft uId dId els = transactionally_ $ do
175175 lift $ S.throwError S.err404
176176 else do
177177 _ <- manipulateParams deleteElementsForIdQ (Only dId)
178− traversePrepared_ createDraftElementRowsQ $ elementsToRows dId els
178+ traversePrepared_ createDraftElementRowsQ $ elementsToRows dId uId els
179179
180180getDraftElementRowsQ :: Query Schema (TuplePG (Only DraftId)) (RowPG (ElementRow Draft))
181181getDraftElementRowsQ = selectStar $
denis/src/Data/Schema.hs+12
@@ -47,12 +47,14 @@ type Schema =
4747 "postElements" ::: 'Table (
4848 '[
4949 "fk_post_quote_self_id" ::: 'ForeignKey '["rowElementId"] "posts" '["postRowId"],
50+ "fk_post_element_user_id" ::: 'ForeignKey '["rowElementAuthorId"] "users" '["userId"],
5051 "fk_post_quote_id" ::: 'ForeignKey '["rowElementQuote"] "quotes" '["quoteRowId"]
5152 -- ,
5253 -- "unique_post_quote" ::: 'Check '["rowElementOrd", "rowElementMarkdown", "rowElementLatex", "rowElementImage", "rowElementQuote", "rowElementAttachment"]
5354 ] :=>
5455 '[
5556 "rowElementId" ::: 'NoDef :=> 'NotNull 'PGint8,
57+ "rowElementAuthorId" ::: 'NoDef :=> 'NotNull 'PGint8,
5658 "rowElementOrd" ::: 'NoDef :=> 'NotNull 'PGint8,
5759 "rowElementMarkdown" ::: 'NoDef :=> 'Null 'PGtext,
5860 "rowElementLatex" ::: 'NoDef :=> 'Null 'PGtext,
@@ -63,12 +65,14 @@ type Schema =
6365 "quoteElements" ::: 'Table (
6466 '[
6567 "fk_quotes_quote_self_id" ::: 'ForeignKey '["rowElementId"] "quotes" '["quoteRowId"],
68+ "fk_quote_element_user_id" ::: 'ForeignKey '["rowElementAuthorId"] "users" '["userId"],
6669 "fk_quote_quote_id" ::: 'ForeignKey '["rowElementQuote"] "quotes" '["quoteRowId"]
6770 -- ,
6871 -- "unique_quote_quote" ::: 'Check '["rowElementOrd", "rowElementMarkdown", "rowElementLatex", "rowElementImage", "rowElementQuote", "rowElementAttachment"]
6972 ] :=>
7073 '[
7174 "rowElementId" ::: 'NoDef :=> 'NotNull 'PGint8,
75+ "rowElementAuthorId" ::: 'NoDef :=> 'NotNull 'PGint8,
7276 "rowElementOrd" ::: 'NoDef :=> 'NotNull 'PGint8,
7377 "rowElementMarkdown" ::: 'NoDef :=> 'Null 'PGtext,
7478 "rowElementLatex" ::: 'NoDef :=> 'Null 'PGtext,
@@ -79,12 +83,14 @@ type Schema =
7983 "draftElements" ::: 'Table (
8084 '[
8185 "fk_draft_quote_self_id" ::: 'ForeignKey '["rowElementId"] "drafts" '["postRowId"],
86+ "fk_draft_element_user_id" ::: 'ForeignKey '["rowElementAuthorId"] "users" '["userId"],
8287 "fk_draft_quote_id" ::: 'ForeignKey '["rowElementQuote"] "quotes" '["quoteRowId"]
8388 -- ,
8489 -- "unique_post_quote" ::: 'Check '["rowElementOrd", "rowElementMarkdown", "rowElementLatex", "rowElementImage", "rowElementQuote", "rowElementAttachment"]
8590 ] :=>
8691 '[
8792 "rowElementId" ::: 'NoDef :=> 'NotNull 'PGint8,
93+ "rowElementAuthorId" ::: 'NoDef :=> 'NotNull 'PGint8,
8894 "rowElementOrd" ::: 'NoDef :=> 'NotNull 'PGint8,
8995 "rowElementMarkdown" ::: 'NoDef :=> 'Null 'PGtext,
9096 "rowElementLatex" ::: 'NoDef :=> 'Null 'PGtext,
@@ -123,6 +129,7 @@ createTables = createTable #users (
123129 foreignKey #postRowAuthorId #users #userId OnDeleteCascade OnUpdateCascade `as` #fk_draft_author_id
124130 ) >>> createTable #postElements (
125131 notNullable int8 `as` #rowElementId :*
132+ notNullable int8 `as` #rowElementAuthorId :*
126133 notNullable int8 `as` #rowElementOrd :*
127134 nullable text `as` #rowElementMarkdown :*
128135 nullable text `as` #rowElementLatex :*
@@ -131,9 +138,11 @@ createTables = createTable #users (
131138 nullable text `as` #rowElementAttachment
132139 ) (
133140 foreignKey #rowElementId #posts #postRowId OnDeleteCascade OnUpdateCascade `as` #fk_post_quote_self_id :*
141+ foreignKey #rowElementAuthorId #users #userId OnDeleteCascade OnUpdateCascade `as` #fk_post_element_user_id :*
134142 foreignKey #rowElementQuote #quotes #quoteRowId OnDeleteCascade OnUpdateCascade `as` #fk_post_quote_id
135143 ) >>> createTable #quoteElements (
136144 notNullable int8 `as` #rowElementId :*
145+ notNullable int8 `as` #rowElementAuthorId :*
137146 notNullable int8 `as` #rowElementOrd :*
138147 nullable text `as` #rowElementMarkdown :*
139148 nullable text `as` #rowElementLatex :*
@@ -142,9 +151,11 @@ createTables = createTable #users (
142151 nullable text `as` #rowElementAttachment
143152 ) (
144153 foreignKey #rowElementId #quotes #quoteRowId OnDeleteCascade OnUpdateCascade `as` #fk_quotes_quote_self_id :*
154+ foreignKey #rowElementAuthorId #users #userId OnDeleteCascade OnUpdateCascade `as` #fk_quote_element_user_id :*
145155 foreignKey #rowElementQuote #quotes #quoteRowId OnDeleteCascade OnUpdateCascade `as` #fk_quote_quote_id
146156 ) >>> createTable #draftElements (
147157 notNullable int8 `as` #rowElementId :*
158+ notNullable int8 `as` #rowElementAuthorId :*
148159 notNullable int8 `as` #rowElementOrd :*
149160 nullable text `as` #rowElementMarkdown :*
150161 nullable text `as` #rowElementLatex :*
@@ -153,6 +164,7 @@ createTables = createTable #users (
153164 nullable text `as` #rowElementAttachment
154165 ) (
155166 foreignKey #rowElementId #drafts #postRowId OnDeleteCascade OnUpdateCascade `as` #fk_draft_quote_self_id :*
167+ foreignKey #rowElementAuthorId #users #userId OnDeleteCascade OnUpdateCascade `as` #fk_draft_element_user_id :*
156168 foreignKey #rowElementQuote #quotes #quoteRowId OnDeleteCascade OnUpdateCascade `as` #fk_draft_quote_id
157169 )
158170-- quoteUniquenessCheck :: TableConstraintExpression Schema _ (Check '["rowElementOrd", "rowElementMarkdown", "rowElementLatex", "rowElementImage", "rowElementQuote", "rowElementAttachment"])