packages feed

wikimusic-api-1.2.0.8: src/WikiMusic/Beam/Database.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.Database where

import Database.Beam
import Optics
import WikiMusic.Beam.Artist
import WikiMusic.Beam.Genre
import WikiMusic.Beam.Relations
import WikiMusic.Beam.Song
import WikiMusic.Beam.User
import WikiMusic.Protolude

data WikiMusicDatabase f = WikiMusicDatabase
  { songs :: f (TableEntity SongT),
    songComments :: f (TableEntity SongCommentT),
    songArtworks :: f (TableEntity SongArtworkT),
    songOpinions :: f (TableEntity SongOpinionT),
    songExternalSources :: f (TableEntity SongExternalSourcesT),
    songContents :: f (TableEntity SongContentsT),
    genres :: f (TableEntity GenreT),
    genreComments :: f (TableEntity GenreCommentT),
    genreArtworks :: f (TableEntity GenreArtworkT),
    genreOpinions :: f (TableEntity GenreOpinionT),
    genreExternalSources :: f (TableEntity GenreExternalSourcesT),
    artists :: f (TableEntity ArtistT),
    artistComments :: f (TableEntity ArtistCommentT),
    artistArtworks :: f (TableEntity ArtistArtworkT),
    artistOpinions :: f (TableEntity ArtistOpinionT),
    artistExternalSources :: f (TableEntity ArtistExternalSourcesT),
    users :: f (TableEntity UserT),
    userRoles :: f (TableEntity UserRoleT),
    songArtists :: f (TableEntity SongArtistT),
    songGenres :: f (TableEntity SongGenreT),
    artistGenres :: f (TableEntity ArtistGenreT)
  }
  deriving (Generic, Database be)

makeFieldLabelsNoPrefix ''WikiMusicDatabase

wikiMusicDatabase :: DatabaseSettings be WikiMusicDatabase
wikiMusicDatabase =
  defaultDbSettings
    `withDbModification` dbModification
      { songs =
          setEntityName "songs"
            <> modifyTableFields
              songTModification,
        songComments =
          setEntityName "song_comments"
            <> modifyTableFields
              songCommentTModification,
        songArtworks =
          setEntityName "song_artworks"
            <> modifyTableFields
              songArtworkTModification,
        songOpinions =
          setEntityName "song_opinions"
            <> modifyTableFields
              songOpinionTModification,
        songExternalSources =
          setEntityName "song_external_sources"
            <> modifyTableFields
              songExternalSourcesTModification,
        songContents =
          setEntityName "song_contents"
            <> modifyTableFields songContentsTModification,
        genres =
          setEntityName "genres"
            <> modifyTableFields
              genreTModification,
        genreComments =
          setEntityName "genre_comments"
            <> modifyTableFields
              genreCommentTModification,
        genreArtworks =
          setEntityName "genre_artworks"
            <> modifyTableFields
              genreArtworkTModification,
        genreOpinions =
          setEntityName "genre_opinions"
            <> modifyTableFields
              genreOpinionTModification,
        genreExternalSources =
          setEntityName "genre_external_sources"
            <> modifyTableFields
              genreExternalSourcesTModification,
        artists =
          setEntityName "artists"
            <> modifyTableFields
              artistTModification,
        artistComments =
          setEntityName "artist_comments"
            <> modifyTableFields
              artistCommentTModification,
        artistArtworks =
          setEntityName "artist_artworks"
            <> modifyTableFields
              artistArtworkTModification,
        artistOpinions =
          setEntityName "artist_opinions"
            <> modifyTableFields
              artistOpinionTModification,
        artistExternalSources =
          setEntityName "artist_external_sources"
            <> modifyTableFields
              artistExternalSourcesTModification,
        users =
          setEntityName "users"
            <> modifyTableFields
              userTModification,
        userRoles =
          setEntityName "user_roles"
            <> modifyTableFields
              userRoleTModification,
        songArtists =
          setEntityName "song_artists"
            <> modifyTableFields songArtistTModification,
        songGenres =
          setEntityName "song_genres"
            <> modifyTableFields songGenreTModification,
        artistGenres =
          setEntityName "artist_genres"
            <> modifyTableFields artistGenreTModification
      }