packages feed

polysemy-account-api-0.2.0.0: lib/Polysemy/Account/Db/Dd.hs

{-# options_haddock prune #-}
{-# options_ghc -Wno-partial-type-signatures #-}

-- | Description: Sqel Dd definitions for account and auth tables
module Polysemy.Account.Db.Dd where

import Prelude hiding (Mod)
import Sqel (
  Dd,
  EnumColumn,
  Mod,
  Mods,
  Prim,
  PrimNewtype,
  PrimaryKey,
  Prod,
  Sqel,
  Uid,
  UidDd,
  array,
  enum,
  nullable,
  pk,
  prim,
  primNewtype,
  prod,
  uid,
  type (*>),
  type (:>) ((:>)),
  type (>),
  )
import Sqel.Codec (PrimColumn)
import Sqel.Comp (Column)
import Sqel.Data.Codec (FullCodec)
import Sqel.Data.PgType (PgPrimName)
import Sqel.Data.TableSchema (TableSchema)
import Sqel.Ext (named)
import Sqel.PgType (tableSchema)
import Sqel.ReifyCodec (ReifyCodec)
import Sqel.ReifyDd (ReifyDd)

import Polysemy.Account.Data.Account (Account, AccountP)
import Polysemy.Account.Data.AccountAuth (AccountAuth)
import Polysemy.Account.Data.AccountName (AccountName)
import Polysemy.Account.Data.AccountStatus (AccountStatus)
import Polysemy.Account.Data.Privilege (Privilege)

type DdAccount i p s =
  UidDd (Mod PrimaryKey (Prim "id" i)) (
    Prod (Account p) *>
    PrimNewtype "name" AccountName >
    Mods [PgPrimName, EnumColumn] (Prim "status" AccountStatus) >
    s
  )

privileges :: Sqel [Privilege] _
privileges =
  named @"privileges" (array enum)

account ::
  Column p "privileges" s s =>
  Dd s ->
  Dd (DdAccount i p s)
account p =
  uid (pk prim) (prod (primNewtype :> enum :> p))

accountP :: Sqel (Uid i AccountP) _
accountP =
  account privileges

accountSchema ::
  PrimColumn i =>
  Column p "privileges" s s =>
  ReifyCodec FullCodec s p =>
  ReifyDd s =>
  Dd s ->
  TableSchema (Uid i (Account p))
accountSchema p =
  tableSchema (account p)

accountSchemaP ::
  PrimColumn i =>
  TableSchema (Uid i AccountP)
accountSchemaP =
  tableSchema accountP

accountAuth ::
  Sqel (Uid i (AccountAuth i)) _
accountAuth =
  uid (pk prim) (prod (prim :> primNewtype :> primNewtype :> nullable prim))

accountAuthSchema ::
  PrimColumn i =>
  TableSchema (Uid i (AccountAuth i))
accountAuthSchema =
  tableSchema accountAuth