packages feed

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

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

module Schema.Book
  ( BookTable (..),
    BookRow (..),
    BookSelect (..),
    BookPicked (..),
    bookSelect,
    bookSelectColumns,
    parseBookPicked,
    toBookPicked,
    BookCreate (..),
    BookUpdate (..),
    bookId,
    bookShelfId,
    bookTitle
  )
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 BookTable = BookTable

type instance PrimaryKeyType BookTable = UUID

type instance ModelTable "Book" = BookTable

instance Entity BookTable where
  tableName = "test_book"
  primaryKey = bookId
  tableColumns = ["id", "shelf_id", "title"]

instance Insertable BookTable where
  type CreateInput BookTable = BookCreate
  toInsertBuilder input =
    setMaybe bookId input.id $
      set bookShelfId input.shelfId $
      set bookTitle input.title $
      emptyInsert @BookTable


instance Updatable BookTable where
  type UpdateInput BookTable = BookUpdate
  updatedAtField = Nothing
  toUpdateBuilder input =
    setFieldMaybe bookShelfId input.shelfId $
      setFieldMaybe bookTitle input.title $
      emptyUpdate @BookTable


data BookRow = BookRow
  { id :: UUID,
    shelfId :: UUID,
    title :: Text
  }
  deriving (Show, Eq)


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


data BookUpdate = BookUpdate
  { shelfId :: Maybe UUID,
    title :: Maybe Text
  }
  deriving (Show, Eq)


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


data BookSelect = BookSelect
  { id :: Bool,
    shelfId :: Bool,
    title :: Bool
  }
  deriving (Show, Eq)
data BookPicked = BookPicked
  { id :: UUID,
    shelfId :: Picked UUID,
    title :: Picked Text
  }
  deriving (Show, Eq)
bookSelect :: BookSelect
bookSelect =
  BookSelect
    { id = False,
      shelfId = False,
      title = False
    }
bookSelectColumns :: BookSelect -> [Text]
bookSelectColumns select_ =
  fieldColumn bookId
    : concat
      [ [fieldColumn bookShelfId | select_.shelfId]
      , [fieldColumn bookTitle | select_.title]
      ]
parseBookPicked :: BookSelect -> RowParser BookPicked
parseBookPicked select_ = do
  idVal <- field
  shelfIdVal <- if select_.shelfId then Picked <$> field else pure Skipped
  titleVal <- if select_.title then Picked <$> field else pure Skipped
  pure BookPicked { id = idVal, shelfId = shelfIdVal, title = titleVal }
toBookPicked :: BookSelect -> BookRow -> BookPicked
toBookPicked select_ row =
  BookPicked
    { id = row.id,
      shelfId = picked select_.shelfId row.shelfId,
      title = picked select_.title row.title
    }


bookId :: Field BookTable UUID
bookId = Field "id" "id"

bookShelfId :: Field BookTable UUID
bookShelfId = Field "shelfId" "shelf_id"

bookTitle :: Field BookTable Text
bookTitle = Field "title" "title"