packages feed

wikimusic-api-1.2.0.8: src/WikiMusic/Beam/Artist.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# OPTIONS_GHC -fno-warn-ambiguous-fields #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module WikiMusic.Beam.Artist where

import Data.Map qualified as Map
import Data.UUID qualified as UUID
import Database.Beam
import Optics
import Relude
import WikiMusic.Beam.Util
import WikiMusic.Model.Artist
import WikiMusic.Protolude

data ArtistT f = Artist'
  { identifier :: C f Text,
    displayName :: C f Text,
    createdBy :: C f Text,
    visibilityStatus :: C f Int64,
    approvedBy :: C f (Maybe Text),
    createdAt :: C f UTCTime,
    lastEditedAt :: C f (Maybe UTCTime),
    viewCount :: C f Int64,
    description :: C f (Maybe Text)
  }
  deriving (Generic, Beamable)

makeFieldLabelsNoPrefix ''ArtistT

type Artist' = ArtistT Identity

instance Table ArtistT where
  data PrimaryKey ArtistT f = ArtistId (Columnar f Text) deriving (Generic, Beamable)
  primaryKey = ArtistId . (^. #identifier)

fromArtistPk :: PrimaryKey ArtistT f -> Columnar f Text
fromArtistPk (ArtistId i) = i

toArtist :: Artist' -> ExternalSources -> (UUID, Artist)
toArtist x ex =
  ( textToUUID $ x ^. #identifier,
    Artist
      { identifier = textToUUID $ x ^. #identifier,
        displayName = x ^. #displayName,
        createdBy = textToUUID $ x ^. #createdBy,
        visibilityStatus = fromIntegral $ x ^. #visibilityStatus,
        approvedBy = fmap (textToUUID) (x ^. #approvedBy),
        createdAt = x ^. #createdAt,
        lastEditedAt = x ^. #lastEditedAt,
        viewCount = fromIntegral $ x ^. #viewCount,
        description = x ^. #description,
        artworks = Map.empty,
        comments = [],
        opinions = Map.empty,
        spotifyUrl = ex ^. #spotifyUrl,
        youtubeUrl = ex ^. #youtubeUrl,
        soundcloudUrl = ex ^. #soundcloudUrl,
        wikipediaUrl = ex ^. #wikipediaUrl
      }
  )

toPersistenceArtist :: Artist -> Artist'
toPersistenceArtist x =
  Artist'
    { identifier = UUID.toText $ x ^. #identifier,
      displayName = x ^. #displayName,
      createdBy = UUID.toText $ x ^. #createdBy,
      visibilityStatus = fromIntegral $ x ^. #visibilityStatus,
      approvedBy = fmap (UUID.toText) (x ^. #approvedBy),
      createdAt = x ^. #createdAt,
      lastEditedAt = x ^. #lastEditedAt,
      viewCount = fromIntegral $ x ^. #viewCount,
      description = x ^. #description
    }

data ArtistCommentT f = ArtistComment'
  { identifier :: C f Text,
    parentIdentifier :: C f (Maybe Text),
    artistIdentifier :: PrimaryKey ArtistT f,
    createdBy :: C f Text,
    visibilityStatus :: C f Int64,
    contents :: C f Text,
    approvedBy :: C f (Maybe Text),
    createdAt :: C f UTCTime,
    lastEditedAt :: C f (Maybe UTCTime)
  }
  deriving (Generic, Beamable)

type ArtistComment' = ArtistCommentT Identity

instance Table ArtistCommentT where
  data PrimaryKey ArtistCommentT f = ArtistCommentId (Columnar f Text) deriving (Generic, Beamable)
  primaryKey = ArtistCommentId . (^. #identifier)

makeFieldLabelsNoPrefix ''ArtistCommentT

toArtistComment :: ArtistComment' -> (UUID, ArtistComment)
toArtistComment x =
  ( textToUUID $ x ^. #identifier,
    ArtistComment
      { artistIdentifier = textToUUID $ fromArtistPk $ x ^. #artistIdentifier,
        comment = fromPersistenceComment x
      }
  )

toPersistenceArtistComment :: ArtistComment -> ArtistComment'
toPersistenceArtistComment x =
  ArtistComment'
    { identifier = UUID.toText $ x ^. #comment % #identifier,
      parentIdentifier = fmap UUID.toText (x ^. #comment % #parentIdentifier),
      artistIdentifier = ArtistId . UUID.toText $ x ^. #artistIdentifier,
      createdBy = UUID.toText $ x ^. #comment % #createdBy,
      visibilityStatus = fromIntegral $ x ^. #comment % #visibilityStatus,
      contents = x ^. #comment % #contents,
      approvedBy = fmap (UUID.toText) (x ^. #comment % #approvedBy),
      createdAt = x ^. #comment % #createdAt,
      lastEditedAt = x ^. #comment % #lastEditedAt
    }

data ArtistArtworkT f = ArtistArtwork'
  { identifier :: C f Text,
    artistIdentifier :: PrimaryKey ArtistT f,
    createdBy :: C f Text,
    visibilityStatus :: C f Int64,
    approvedBy :: C f (Maybe Text),
    contentUrl :: C f Text,
    contentCaption :: C f (Maybe Text),
    orderValue :: C f Int64,
    createdAt :: C f UTCTime,
    lastEditedAt :: C f (Maybe UTCTime)
  }
  deriving (Generic, Beamable)

type ArtistArtwork' = ArtistArtworkT Identity

instance Table ArtistArtworkT where
  data PrimaryKey ArtistArtworkT f = ArtistArtworkId (Columnar f Text) deriving (Generic, Beamable)
  primaryKey = ArtistArtworkId . (^. #identifier)

makeFieldLabelsNoPrefix ''ArtistArtworkT

toArtistArtwork :: ArtistArtwork' -> (UUID, ArtistArtwork)
toArtistArtwork x =
  ( textToUUID $ x ^. #identifier,
    ArtistArtwork
      { artistIdentifier = textToUUID $ fromArtistPk $ x ^. #artistIdentifier,
        artwork = fromPersistenceArtwork x
      }
  )

mkArtistArtworkP :: ArtistArtwork -> ArtistArtwork'
mkArtistArtworkP x =
  ArtistArtwork'
    { identifier = UUID.toText $ x ^. #artwork % #identifier,
      artistIdentifier = ArtistId $ UUID.toText $ x ^. #artistIdentifier,
      createdBy = UUID.toText $ x ^. #artwork % #createdBy,
      visibilityStatus = fromIntegral $ x ^. #artwork % #visibilityStatus,
      contentUrl = x ^. #artwork % #contentUrl,
      contentCaption = x ^. #artwork % #contentCaption,
      orderValue = fromIntegral $ x ^. #artwork % #orderValue,
      approvedBy = fmap (UUID.toText) (x ^. #artwork % #approvedBy),
      createdAt = x ^. #artwork % #createdAt,
      lastEditedAt = x ^. #artwork % #lastEditedAt
    }

data ArtistOpinionT f = ArtistOpinion'
  { identifier :: C f Text,
    artistIdentifier :: PrimaryKey ArtistT f,
    createdBy :: C f Text,
    isLike :: C f Bool,
    isDislike :: C f Bool,
    createdAt :: C f UTCTime,
    lastEditedAt :: C f (Maybe UTCTime)
  }
  deriving (Generic, Beamable)

type ArtistOpinion' = ArtistOpinionT Identity

instance Table ArtistOpinionT where
  data PrimaryKey ArtistOpinionT f = ArtistOpinionId (Columnar f Text) deriving (Generic, Beamable)
  primaryKey = ArtistOpinionId . (^. #identifier)

makeFieldLabelsNoPrefix ''ArtistOpinionT

toArtistOpinion :: ArtistOpinion' -> (UUID, ArtistOpinion)
toArtistOpinion x =
  ( textToUUID $ x ^. #identifier,
    ArtistOpinion
      { artistIdentifier = textToUUID $ fromArtistPk $ x ^. #artistIdentifier,
        opinion = fromPersistenceOpinion x
      }
  )

data ArtistExternalSourcesT f = ArtistExternalSources'
  { identifier :: C f Text,
    artistIdentifier :: PrimaryKey ArtistT f,
    createdBy :: C f Text,
    spotifyUrl :: C f (Maybe Text),
    youtubeUrl :: C f (Maybe Text),
    soundcloudUrl :: C f (Maybe Text),
    wikipediaUrl :: C f (Maybe Text),
    createdAt :: C f UTCTime,
    lastEditedAt :: C f (Maybe UTCTime)
  }
  deriving (Generic, Beamable)

type ArtistExternalSources' = ArtistExternalSourcesT Identity

instance Table ArtistExternalSourcesT where
  data PrimaryKey ArtistExternalSourcesT f = ArtistExternalSourcesId (Columnar f Text) deriving (Generic, Beamable)
  primaryKey = ArtistExternalSourcesId . (^. #identifier)

makeFieldLabelsNoPrefix ''ArtistExternalSourcesT

toPersistenceArtistExternalContents :: Artist -> UUID -> ArtistExternalSources'
toPersistenceArtistExternalContents x newIdentifier =
  ArtistExternalSources'
    { identifier = UUID.toText $ newIdentifier,
      artistIdentifier = ArtistId $ UUID.toText $ x ^. #identifier,
      createdBy = UUID.toText $ x ^. #createdBy,
      spotifyUrl = x ^. #spotifyUrl,
      youtubeUrl = x ^. #youtubeUrl,
      soundcloudUrl = x ^. #soundcloudUrl,
      wikipediaUrl = x ^. #wikipediaUrl,
      createdAt = x ^. #createdAt,
      lastEditedAt = x ^. #lastEditedAt
    }

mkArtistExSourcesP :: ArtistExternalSources -> ArtistExternalSources'
mkArtistExSourcesP x =
  ArtistExternalSources'
    { identifier = UUID.toText $ x ^. #identifier,
      artistIdentifier = ArtistId $ UUID.toText $ x ^. #artistIdentifier,
      createdBy = UUID.toText $ x ^. #createdBy,
      spotifyUrl = x ^. #spotifyUrl,
      youtubeUrl = x ^. #youtubeUrl,
      soundcloudUrl = x ^. #soundcloudUrl,
      wikipediaUrl = x ^. #wikipediaUrl,
      createdAt = x ^. #createdAt,
      lastEditedAt = x ^. #lastEditedAt
    }

artistTModification :: ArtistT (FieldModification (TableField ArtistT))
artistTModification =
  tableModification
    { identifier = "identifier",
      displayName = "display_name",
      createdBy = "created_by",
      visibilityStatus = "visibility_status",
      approvedBy = "approved_by",
      createdAt = "created_at",
      lastEditedAt = "last_edited_at",
      viewCount = "views",
      description = "description"
    }

artistCommentTModification :: ArtistCommentT (FieldModification (TableField ArtistCommentT))
artistCommentTModification =
  tableModification
    { identifier = "identifier",
      artistIdentifier = ArtistId "artist_identifier",
      parentIdentifier = "parent_identifier",
      createdBy = "created_by",
      visibilityStatus = "visibility_status",
      contents = "contents",
      approvedBy = "approved_by",
      createdAt = "created_at",
      lastEditedAt = "last_edited_at"
    }

artistArtworkTModification :: ArtistArtworkT (FieldModification (TableField ArtistArtworkT))
artistArtworkTModification =
  tableModification
    { identifier = "identifier",
      artistIdentifier = ArtistId "artist_identifier",
      createdBy = "created_by",
      visibilityStatus = "visibility_status",
      approvedBy = "approved_by",
      contentUrl = "content_url",
      contentCaption = "content_caption",
      orderValue = "order_value",
      createdAt = "created_at",
      lastEditedAt = "last_edited_at"
    }

artistOpinionTModification :: ArtistOpinionT (FieldModification (TableField ArtistOpinionT))
artistOpinionTModification =
  tableModification
    { identifier = "identifier",
      artistIdentifier = ArtistId "artist_identifier",
      createdBy = "created_by",
      isLike = "is_like",
      isDislike = "is_dislike",
      createdAt = "created_at",
      lastEditedAt = "last_edited_at"
    }

artistExternalSourcesTModification :: ArtistExternalSourcesT (FieldModification (TableField ArtistExternalSourcesT))
artistExternalSourcesTModification =
  tableModification
    { identifier = "identifier",
      artistIdentifier = ArtistId "artist_identifier",
      createdBy = "created_by",
      spotifyUrl = "spotify_url",
      youtubeUrl = "youtube_url",
      soundcloudUrl = "soundcloud_url",
      wikipediaUrl = "wikipedia_url",
      createdAt = "created_at",
      lastEditedAt = "last_edited_at"
    }

mkArtistOpinionP :: ArtistOpinion -> ArtistOpinion'
mkArtistOpinionP x =
  ArtistOpinion'
    { identifier = UUID.toText $ x ^. #opinion % #identifier,
      artistIdentifier = ArtistId $ UUID.toText $ x ^. #artistIdentifier,
      createdBy = UUID.toText $ x ^. #opinion % #createdBy,
      isLike = x ^. #opinion % #isLike,
      isDislike = x ^. #opinion % #isDislike,
      createdAt = x ^. #opinion % #createdAt,
      lastEditedAt = x ^. #opinion % #lastEditedAt
    }