1+ module Server.Asks.Database where
2+
3+ import Droplet.Language
4+ import Prelude hiding (not )
5+
6+ import Data.Maybe as DM
7+ import Data.Tuple.Nested ((/\))
8+ import Server.Database as SD
9+ import Server.Database.Asks (_answer , _answerer , _asker , asks )
10+ import Server.Database.Blocks (_blocked , _blocker , blocks )
11+ import Server.Database.DoppelgangerQuestions (_question )
12+ import Server.Database.Fields (_id , _recipient , _sender , l , s , u )
13+ import Server.Database.Histories (histories )
14+ import Server.Database.Types (Checked (..))
15+ import Server.Database.Users (_asksVisibility , _temporary , users )
16+ import Server.Effect (ServerEffect )
17+ import Shared.User (ProfileVisibility (..))
18+
19+ isAllowedToAsk :: Int -> Int -> ServerEffect Boolean
20+ isAllowedToAsk loggedUserId userId = do
21+ found <- SD .single $ select _id # from (users # as u) # wher ( u ... _id .=. userId .&&.
22+ ( _asksVisibility .=. Everyone
23+ .||. _asksVisibility
24+ .=. NoTemporaryUsers
25+ .&&. not (exists $ select (1 # as l) # from (users # as s) # wher (s ... _id .=. loggedUserId .&&. _temporary .=. Checked true ))
26+ .||. _asksVisibility
27+ .=. Contacts
28+ .&&. (exists $ select (1 # as l) # from (histories # as s) # wher (_sender .=. loggedUserId .&&. _recipient .=. userId .||. _recipient .=. loggedUserId .&&. _sender .=. userId))
29+ ) .&&. not (exists $ select (1 # as u) # from blocks # wher (_blocker .=. loggedUserId .&&. _blocked .=. u ... _id .||. _blocker .=. u ... _id .&&. _blocked .=. loggedUserId))
30+ .&&. not (exists $ select (1 # as u) # from asks # wher (_answerer .=. (u ... _id) .&&. _asker .=. loggedUserId .&&. isNull _answer))
31+ )
32+ pure $ DM .isJust found
33+
34+ saveAsk :: Int -> Int -> String -> ServerEffect Unit
35+ saveAsk loggedUserId useId question = SD .execute $ insert # into asks (_asker /\ _answerer /\ _question) # values (loggedUserId /\ useId /\ question)
0 commit comments