49 lines
1.8 KiB
Haskell
49 lines
1.8 KiB
Haskell
|
|
module Web.Controller.StewardshipRoles where
|
||
|
|
|
||
|
|
import Web.Types
|
||
|
|
import Web.View.StewardshipRoles.Index
|
||
|
|
import Web.View.StewardshipRoles.Show
|
||
|
|
import Web.View.StewardshipRoles.New
|
||
|
|
import Generated.Types
|
||
|
|
import IHP.Prelude
|
||
|
|
import IHP.ControllerPrelude
|
||
|
|
|
||
|
|
instance Controller StewardshipRolesController where
|
||
|
|
beforeAction = ensureIsUser
|
||
|
|
|
||
|
|
action StewardshipRolesAction = autoRefresh do
|
||
|
|
roles <- query @StewardshipRole |> orderByDesc #grantedAt |> fetch
|
||
|
|
hubs <- query @Hub |> fetch
|
||
|
|
render IndexView { roles, hubs }
|
||
|
|
|
||
|
|
action ShowStewardshipRoleAction { stewardshipRoleId } = do
|
||
|
|
role <- fetch stewardshipRoleId
|
||
|
|
hub <- fetch role.hubId
|
||
|
|
render ShowView { role, hub }
|
||
|
|
|
||
|
|
action NewStewardshipRoleAction = do
|
||
|
|
let role = newRecord @StewardshipRole
|
||
|
|
hubs <- query @Hub |> orderByAsc #name |> fetch
|
||
|
|
render NewView { role, hubs }
|
||
|
|
|
||
|
|
action CreateStewardshipRoleAction = do
|
||
|
|
let role = newRecord @StewardshipRole
|
||
|
|
hubs <- query @Hub |> orderByAsc #name |> fetch
|
||
|
|
role
|
||
|
|
|> fill @'["hubId","roleName","assignedTo","notes"]
|
||
|
|
|> validateField #roleName nonEmpty
|
||
|
|
|> validateField #assignedTo nonEmpty
|
||
|
|
|> ifValid \case
|
||
|
|
Left r -> render NewView { role = r, hubs }
|
||
|
|
Right r -> do
|
||
|
|
r <- createRecord r
|
||
|
|
setSuccessMessage "Stewardship role granted"
|
||
|
|
redirectTo ShowStewardshipRoleAction { stewardshipRoleId = r.id }
|
||
|
|
|
||
|
|
action RevokeRoleAction { stewardshipRoleId } = do
|
||
|
|
role <- fetch stewardshipRoleId
|
||
|
|
now <- getCurrentTime
|
||
|
|
role |> set #revokedAt (Just now) |> updateRecord
|
||
|
|
setSuccessMessage "Role revoked"
|
||
|
|
redirectTo StewardshipRolesAction
|