1 {-# LANGUAGE OverloadedStrings, TypeFamilies #-}
    2 module Model.Asset.Types
    3   ( AssetRow(..)
    4   , Asset(..)
    5   , getAssetReleaseMaybe
    6   , getAssetFormat
    7   , blankAsset
    8   ) where
    9 
   10 import qualified Data.ByteString as BS
   11 import Data.Int (Int64)
   12 import qualified Data.Text as T
   13 
   14 import Has (Has(..))
   15 import Model.Offset
   16 import Model.Kind
   17 import Model.Release.Types
   18 import Model.Id.Types
   19 import Model.Volume.Types
   20 import Model.Format.Types
   21 
   22 type instance IdType Asset = Int32
   23 
   24 data AssetRow = AssetRow
   25   { assetId :: Id Asset
   26   , assetFormat :: Format
   27   , assetRelease :: Maybe Release
   28   , assetDuration :: Maybe Offset
   29   , assetName :: Maybe T.Text
   30   , assetSHA1 :: Maybe BS.ByteString
   31   , assetSize :: Maybe Int64
   32   }
   33 
   34 data Asset = Asset
   35   { assetRow :: !AssetRow
   36   , assetVolume :: Volume
   37   }
   38 
   39 instance Kinded Asset where
   40   kindOf _ = "asset"
   41 
   42 instance Has (Id Asset) AssetRow where
   43   view = assetId
   44 instance Has Format AssetRow where
   45   view = assetFormat
   46 instance Has (Id Format) AssetRow where
   47   view = formatId . assetFormat
   48 
   49 instance Has AssetRow Asset where
   50   view = assetRow
   51 instance Has (Id Asset) Asset where
   52   view = view . assetRow
   53 instance Has Format Asset where
   54   view = view . assetRow
   55 instance Has (Id Format) Asset where
   56   view = view . assetRow
   57 instance Has Volume Asset where
   58    view = assetVolume
   59 instance Has (Id Volume) Asset where
   60   view = volumeId . volumeRow . assetVolume
   61 
   62 getAssetReleaseMaybe :: Asset -> Maybe Release
   63 getAssetReleaseMaybe = assetRelease . assetRow
   64 getAssetFormat :: Asset -> Format
   65 getAssetFormat = assetFormat . assetRow
   66 
   67 blankAsset :: Volume -> Asset
   68 blankAsset vol = Asset
   69   { assetRow = AssetRow
   70     { assetId = error "blankAsset"
   71     , assetFormat = unknownFormat
   72     , assetRelease = Nothing
   73     , assetName = Nothing
   74     , assetDuration = Nothing
   75     , assetSHA1 = Nothing
   76     , assetSize = Nothing
   77     }
   78   , assetVolume = vol
   79   }