packages feed

poppy-codegen-1.0.0: test/Poppy/Codegen/golden/Tag.hs.golden

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE TypeApplications #-}

module Schema.Tag
  ( TagTable (..),
    TagRow (..),
    TagSelect (..),
    TagPicked (..),
    tagSelect,
    tagSelectColumns,
    parseTagPicked,
    toTagPicked,
    TagCreate (..),
    TagUpdate (..),
    tagId,
    tagShelfId,
    tagLabel
  )
where

import Data.Text (Text)
import Data.UUID (UUID)
import Poppy.Internal.Generated
  ( FromRow (..),
    RowParser,
    field,
    Entity (..),
    Field (..),
    PrimaryKeyType,
    ModelTable,
    Picked (..),
    picked,
    Insertable (..),
    emptyInsert,
    set,
    setMaybe,
    Updatable (..),
    emptyUpdate,
    setFieldMaybe
  )

data TagTable = TagTable

type instance PrimaryKeyType TagTable = UUID

type instance ModelTable "Tag" = TagTable

instance Entity TagTable where
  tableName = "test_tag"
  primaryKey = tagId
  tableColumns = ["id", "shelf_id", "label"]

instance Insertable TagTable where
  type CreateInput TagTable = TagCreate
  toInsertBuilder input =
    setMaybe tagId input.id $
      set tagShelfId input.shelfId $
      set tagLabel input.label $
      emptyInsert @TagTable


instance Updatable TagTable where
  type UpdateInput TagTable = TagUpdate
  updatedAtField = Nothing
  toUpdateBuilder input =
    setFieldMaybe tagShelfId input.shelfId $
      setFieldMaybe tagLabel input.label $
      emptyUpdate @TagTable


data TagRow = TagRow
  { id :: UUID,
    shelfId :: UUID,
    label :: Text
  }
  deriving (Show, Eq)


data TagCreate = TagCreate
  { id :: Maybe UUID,
    shelfId :: UUID,
    label :: Text
  }
  deriving (Show, Eq)


data TagUpdate = TagUpdate
  { shelfId :: Maybe UUID,
    label :: Maybe Text
  }
  deriving (Show, Eq)


instance FromRow TagRow where
  fromRow = TagRow <$> field <*> field <*> field


data TagSelect = TagSelect
  { id :: Bool,
    shelfId :: Bool,
    label :: Bool
  }
  deriving (Show, Eq)
data TagPicked = TagPicked
  { id :: UUID,
    shelfId :: Picked UUID,
    label :: Picked Text
  }
  deriving (Show, Eq)
tagSelect :: TagSelect
tagSelect =
  TagSelect
    { id = False,
      shelfId = False,
      label = False
    }
tagSelectColumns :: TagSelect -> [Text]
tagSelectColumns select_ =
  fieldColumn tagId
    : concat
      [ [fieldColumn tagShelfId | select_.shelfId]
      , [fieldColumn tagLabel | select_.label]
      ]
parseTagPicked :: TagSelect -> RowParser TagPicked
parseTagPicked select_ = do
  idVal <- field
  shelfIdVal <- if select_.shelfId then Picked <$> field else pure Skipped
  labelVal <- if select_.label then Picked <$> field else pure Skipped
  pure TagPicked { id = idVal, shelfId = shelfIdVal, label = labelVal }
toTagPicked :: TagSelect -> TagRow -> TagPicked
toTagPicked select_ row =
  TagPicked
    { id = row.id,
      shelfId = picked select_.shelfId row.shelfId,
      label = picked select_.label row.label
    }


tagId :: Field TagTable UUID
tagId = Field "id" "id"

tagShelfId :: Field TagTable UUID
tagShelfId = Field "shelfId" "shelf_id"

tagLabel :: Field TagTable Text
tagLabel = Field "label" "label"