module Web.Controller.WidgetOwnerships where import Web.Types import Web.View.WidgetOwnerships.Index import Web.View.WidgetOwnerships.Show import Web.View.WidgetOwnerships.New import Web.View.WidgetOwnerships.Edit import Generated.Types import IHP.Prelude import IHP.ControllerPrelude instance Controller WidgetOwnershipsController where beforeAction = ensureIsUser action WidgetOwnershipsAction = do ownerships <- query @WidgetOwnership |> orderByDesc #createdAt |> fetch widgets <- query @Widget |> fetch hubs <- query @Hub |> fetch render IndexView { ownerships, widgets, hubs } action ShowWidgetOwnershipAction { widgetOwnershipId } = do ownership <- fetch widgetOwnershipId widget <- fetch ownership.widgetId ownerHub <- fetch ownership.ownerHubId mStewardHub <- case ownership.stewardHubId of Nothing -> pure Nothing Just sid -> Just <$> fetch sid render ShowView { ownership, widget, ownerHub, mStewardHub } action NewWidgetOwnershipAction = do let ownership = newRecord @WidgetOwnership widgets <- query @Widget |> orderByAsc #name |> fetch hubs <- query @Hub |> orderByAsc #name |> fetch render NewView { ownership, widgets, hubs } action CreateWidgetOwnershipAction = do let ownership = newRecord @WidgetOwnership widgets <- query @Widget |> orderByAsc #name |> fetch hubs <- query @Hub |> orderByAsc #name |> fetch ownership |> fill @'["widgetId","ownerHubId","stewardHubId","ownershipType","effectiveFrom","effectiveUntil","notes"] |> validateField #ownershipType (isInList ["local","delegated","global"]) |> ifValid \case Left o -> render NewView { ownership = o, widgets, hubs } Right o -> do o <- createRecord o setSuccessMessage "Ownership assigned" redirectTo ShowWidgetOwnershipAction { widgetOwnershipId = o.id } action EditWidgetOwnershipAction { widgetOwnershipId } = do ownership <- fetch widgetOwnershipId widgets <- query @Widget |> orderByAsc #name |> fetch hubs <- query @Hub |> orderByAsc #name |> fetch render EditView { ownership, widgets, hubs } action UpdateWidgetOwnershipAction { widgetOwnershipId } = do ownership <- fetch widgetOwnershipId widgets <- query @Widget |> orderByAsc #name |> fetch hubs <- query @Hub |> orderByAsc #name |> fetch ownership |> fill @'["stewardHubId","ownershipType","effectiveUntil","notes"] |> validateField #ownershipType (isInList ["local","delegated","global"]) |> ifValid \case Left o -> render EditView { ownership = o, widgets, hubs } Right o -> do updateRecord o setSuccessMessage "Ownership updated" redirectTo ShowWidgetOwnershipAction { widgetOwnershipId = o.id }