module Cachix.Api.Types where import Data.Aeson (FromJSON, ToJSON) import Data.Monoid ((<>)) import Data.Swagger (ToSchema, ToParamSchema) import Data.Text (Text, takeEnd, dropEnd) import GHC.Generics (Generic) import Control.DeepSeq (NFData) import Servant.API data NixCacheInfo = NixCacheInfo { storeDir :: Text , wantMassQuery :: Integer , priority :: Integer } deriving (Generic, Show, FromJSON, ToJSON, ToSchema) -- narinfo url includes storePath hash and .narinfo suffix data NarInfo = NarInfo { storePath :: Text -- ^ absolute path of the derivation in nix store , url :: Text -- ^ relative url (to current domain) to download nar file , compression :: Text -- ^ name of the compression algorithm, eg. xz , fileHash :: Text -- ^ sha256 hash of the compressed nar file -- NOTE: to compute use "nix-hash --type sha256 --flat" , fileSize :: Integer -- ^ file size of compressed nar file -- NOTE: du -b , narHash :: Text -- ^ sha256 hash of the decompressed nar file -- NOTE: to compute use "nix-hash --type sha256 --flat --base32" , narSize :: Integer -- ^ file size of decompressed nar file -- NOTE: du -b , references :: [Text] -- ^ immediate dependencies of the storePath -- NOTE: nix-store -q --references , deriver :: Text -- ^ relative store path (to nix store root) of the deriver -- NOTE: nix-store -q --deriver , sig :: Text -- ^ signature of fields: storePath, narHash, narSize, refs } deriving (Generic, Show, FromJSON, ToJSON, ToSchema) data BinaryCache = BinaryCache { name :: Text , uri :: Text , isPublic :: Bool , publicSigningKeys :: [Text] , githubUsername :: Text } deriving (Show, Generic, FromJSON, ToJSON, ToSchema, NFData) newtype BinaryCacheError = BinaryCacheError { error :: Text } deriving (Generic, FromJSON, ToJSON) -- | Hash of nar.xz file newtype NarC = NarC Text deriving (Generic, ToSchema, ToParamSchema) instance FromHttpApiData NarC where parseUrlPiece s = if takeEnd 7 s == ".nar.xz" then Right $ NarC (dropEnd 7 s) else Left "" instance ToHttpApiData NarC where toUrlPiece (NarC n) = n <> ".nar.xz" -- | Store path hash newtype NarInfoC = NarInfoC Text deriving (Generic, ToSchema, ToParamSchema) instance FromHttpApiData NarInfoC where parseUrlPiece s = if takeEnd 8 s == ".narinfo" then Right $ NarInfoC (dropEnd 8 s) else Left "" instance ToHttpApiData NarInfoC where toUrlPiece (NarInfoC n) = n <> ".narinfo" data User = User { fullname :: Maybe Text , username :: Text , email :: Maybe Text , hasOrgsAcccess :: Bool , activeSubscription :: SubscriptionType , subscriptionAccountId :: Maybe Text } deriving (Generic, FromJSON, ToJSON, ToSchema) data SubscriptionType = Community | Starter | Basic | Pro deriving (Generic, FromJSON, ToJSON, ToSchema, Show, Read)