Files
docspell/modules/webapp/src/main/elm/Data/ServerEvent.elm
2022-05-21 00:40:26 +02:00

104 lines
2.5 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.ServerEvent exposing (AddonInfo, JobDoneDetails, ServerEvent(..), decode, isAddonExistingItem)
import Json.Decode as D
import Json.Decode.Pipeline as P
type ServerEvent
= JobSubmitted String
| JobDone JobDoneDetails
| JobsWaiting Int
| AddonInstalled AddonInfo
type alias AddonInfo =
{ success : Bool
, addonId : Maybe String
, addonUrl : Maybe String
, message : String
}
type alias JobDoneDetails =
{ task : String
, args : Maybe D.Value
, result : Maybe D.Value
}
{-| Return wether the job done details belong to running an addon of
that item with the given id.
-}
isAddonExistingItem : String -> JobDoneDetails -> Bool
isAddonExistingItem itemId details =
let
itemIdDecoder =
D.field "itemId" D.string
-- This decodes the structure from scalas ItemAddonTaskArgs (only itemId)
decodedId =
Maybe.map (D.decodeValue itemIdDecoder) details.args
|> Maybe.andThen Result.toMaybe
in
details.task
== "addon-existing-item"
&& (itemId /= "" && decodedId == Just itemId)
addonInfoDecoder : D.Decoder AddonInfo
addonInfoDecoder =
D.succeed AddonInfo
|> P.required "success" D.bool
|> P.optional "addonId" (D.maybe D.string) Nothing
|> P.optional "addonUrl" (D.maybe D.string) Nothing
|> P.required "message" D.string
decoder : D.Decoder ServerEvent
decoder =
D.field "tag" D.string
|> D.andThen decodeTag
decode : D.Value -> Result String ServerEvent
decode json =
D.decodeValue decoder json
|> Result.mapError D.errorToString
decodeTag : String -> D.Decoder ServerEvent
decodeTag tag =
case tag of
"job-done" ->
D.field "content" (D.map JobDone decodeJobDoneDetails)
"job-submitted" ->
D.field "content" D.string
|> D.map JobSubmitted
"jobs-waiting" ->
D.field "content" D.int
|> D.map JobsWaiting
"addon-installed" ->
D.field "content" addonInfoDecoder
|> D.map AddonInstalled
_ ->
D.fail ("Unknown tag: " ++ tag)
decodeJobDoneDetails : D.Decoder JobDoneDetails
decodeJobDoneDetails =
D.map3 JobDoneDetails
(D.field "task" D.string)
(D.field "args" (D.maybe D.value))
(D.field "result" (D.maybe D.value))