1 {-# LANGUAGE TypeFamilies, OverloadedStrings #-}
    2 module Model.Token.Types
    3   ( Token(..)
    4   , AccountToken(..)
    5   , LoginToken(..)
    6   , Session(..)
    7   , Upload(..)
    8   , makeUpload
    9   ) where
   10 
   11 import qualified Data.ByteString as BS
   12 import Data.Int (Int64)
   13 
   14 import Has (Has(..))
   15 import Model.Kind
   16 import Model.Time
   17 import Model.Id.Types
   18 import Model.Party.Types
   19 import Model.Permission.Types
   20 
   21 type instance IdType Token = BS.ByteString
   22 
   23 data Token = Token
   24   { tokenId :: Id Token
   25   , tokenExpires :: Timestamp
   26   }
   27 
   28 instance Has (Id Token) Token where
   29   view = tokenId
   30 
   31 data AccountToken = AccountToken
   32   { accountToken :: !Token
   33   , tokenAccount :: SiteAuth
   34   }
   35 
   36 instance Has (Id Token) AccountToken where
   37   view = view . accountToken
   38 instance Has SiteAuth AccountToken where
   39   view = tokenAccount
   40 instance Has Access AccountToken where
   41   view = view . tokenAccount
   42 instance Has (Id Party) AccountToken where
   43   view = view . tokenAccount
   44 instance Has Account AccountToken where
   45   view = view . tokenAccount
   46 
   47 data LoginToken = LoginToken
   48   { loginAccountToken :: !AccountToken
   49   , loginPasswordToken :: Bool
   50   }
   51 
   52 -- these are signed version of Id Token
   53 type instance IdType LoginToken = BS.ByteString
   54 
   55 instance Kinded LoginToken where
   56   kindOf _ = "token"
   57 
   58 instance Has (Id Token) LoginToken where
   59   view = view . loginAccountToken
   60 instance Has SiteAuth LoginToken where
   61   view = view . loginAccountToken
   62 
   63 data Session = Session
   64   { sessionAccountToken :: !AccountToken
   65   , sessionVerf :: !BS.ByteString
   66   , sessionSuperuser :: Bool
   67   }
   68 
   69 instance Has (Id Token) Session where
   70   view = view . sessionAccountToken
   71 instance Has Access Session where
   72   view = view . sessionAccountToken
   73 instance Has (Id Party) Session where
   74   view = view . sessionAccountToken
   75 instance Has Account Session where
   76   view = view . sessionAccountToken
   77 
   78 data Upload = Upload
   79   { uploadAccountToken :: AccountToken
   80   , uploadFilename :: BS.ByteString
   81   , uploadSize :: Int64
   82   }
   83 
   84 instance Has (Id Token) Upload where
   85   view = view . uploadAccountToken
   86 
   87 makeUpload :: Token -> BS.ByteString -> Int64 -> SiteAuth -> Upload
   88 makeUpload t n z u = Upload (AccountToken t u) n z