feat(users/Profpatsch/mailbox-org): add simple request json example

Adds a simple json quasiquoter thingy.

Json can be sent to the `/mailfilter?action=update` endpoint.

Change-Id: Iba80c2ab69178e431519933c4a01cd68aaa9f637
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7839
Tested-by: BuildkiteCI
Autosubmit: Profpatsch <mail@profpatsch.de>
Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
Profpatsch 2023-01-15 21:20:40 +01:00
parent 1a18c25d81
commit f627ee84b3
5 changed files with 107 additions and 23 deletions

View file

@ -14,6 +14,7 @@
module Main where
import Aeson (parseErrorTree)
import AesonQQ (aesonQQ)
import ArglibNetencode
import Control.Exception (try)
import Control.Monad (replicateM)
@ -21,6 +22,7 @@ import Data.Aeson qualified as Json
import Data.Aeson.BetterErrors qualified as Json
import Data.Aeson.KeyMap qualified as KeyMap
import Data.ByteString qualified as ByteString
import Data.ByteString.Lazy qualified as Lazy
import Data.Char qualified as Char
import Data.Error.Tree
import Data.Functor.Compose
@ -63,8 +65,7 @@ log err = do
putStderrLn (errorContext progName.unCurrentProgramName err & prettyError)
data Tools = Tools
{ sieveTest :: Tool,
pass :: Tool
{ pass :: Tool
}
deriving stock (Show)
@ -75,7 +76,6 @@ parseTools :: Applicative m => (Text -> m (Either Error Tool)) -> m (Either Erro
parseTools getTool = do
let parser =
( do
sieveTest <- get "sieve-test"
pass <- get "pass"
pure Tools {..}
)
@ -144,6 +144,54 @@ data MailfilterList = MailfilterList
}
deriving stock (Show, Eq)
simpleRule ::
( HasField "rulename" r Text,
HasField "id" r Natural,
HasField "emailContains" r Text,
HasField "subjectStartsWith" r Text
) =>
r ->
Json.Value
simpleRule dat = do
[aesonQQ|{
"id": |dat.id & enc @Natural|,
"position": 3,
"rulename": |dat.rulename & enc @Text|,
"active": true,
"flags": [],
"test": {
"id": "allof",
"tests": [
{
"id": "from",
"comparison": "contains",
"values": [
|dat.emailContains & enc @Text|
]
},
{
"id": "subject",
"comparison": "startswith",
"values": [
|dat.subjectStartsWith & enc @Text|
]
}
]
},
"actioncmds": [
{
"id": "move",
"into": "default0/Archive"
},
{
"id": "stop"
}
]
}|]
where
enc :: forall a. Json.ToJSON a => a -> Lazy.ByteString
enc val = val & Json.toJSON & Json.encode
applyFilters :: Session -> IO ()
applyFilters session = do
filters <-