This commit is contained in:
2025-11-30 14:47:56 +09:00
parent 2959775365
commit c97fe2acba
9 changed files with 126 additions and 3 deletions

View File

@@ -17,10 +17,15 @@ extra-source-files:
library library
exposed-modules: exposed-modules:
API.Server API.Server
Data.Model.AudioRequest
Data.Model.TrackRequest
Data.Persist.Tap Data.Persist.Tap
Data.Persist.TapTrans Data.Persist.TapTrans
Data.State.Queue
Data.State.Track Data.State.Track
Data.Types Data.Types
Data.Util.TrackIdGen
Domain.AudioRequest
Domain.Sample Domain.Sample
Env.Cache Env.Cache
Env.Persist.Tap Env.Persist.Tap
@@ -48,6 +53,7 @@ library
FlexibleInstances FlexibleInstances
UndecidableInstances UndecidableInstances
ScopedTypeVariables ScopedTypeVariables
DuplicateRecordFields
build-depends: build-depends:
aeson aeson
, async , async
@@ -55,6 +61,7 @@ library
, bytestring , bytestring
, conferer , conferer
, containers , containers
, cryptohash-sha256
, data-default <0.8.0 , data-default <0.8.0
, data-default-class <0.2 , data-default-class <0.2
, directory , directory
@@ -64,6 +71,7 @@ library
, mongoDB , mongoDB
, mtl , mtl
, optics , optics
, random
, resource-pool , resource-pool
, servant , servant
, servant-server , servant-server
@@ -96,6 +104,7 @@ executable hq-sample
FlexibleInstances FlexibleInstances
UndecidableInstances UndecidableInstances
ScopedTypeVariables ScopedTypeVariables
DuplicateRecordFields
ghc-options: -threaded -rtsopts -with-rtsopts=-N ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: build-depends:
aeson aeson
@@ -104,6 +113,7 @@ executable hq-sample
, bytestring , bytestring
, conferer , conferer
, containers , containers
, cryptohash-sha256
, data-default <0.8.0 , data-default <0.8.0
, data-default-class <0.2 , data-default-class <0.2
, directory , directory
@@ -114,6 +124,7 @@ executable hq-sample
, mongoDB , mongoDB
, mtl , mtl
, optics , optics
, random
, resource-pool , resource-pool
, servant , servant
, servant-server , servant-server
@@ -148,6 +159,7 @@ test-suite hq-sample-test
FlexibleInstances FlexibleInstances
UndecidableInstances UndecidableInstances
ScopedTypeVariables ScopedTypeVariables
DuplicateRecordFields
build-tool-depends: build-tool-depends:
hspec-discover:hspec-discover hspec-discover:hspec-discover
build-depends: build-depends:
@@ -157,6 +169,7 @@ test-suite hq-sample-test
, bytestring , bytestring
, conferer , conferer
, containers , containers
, cryptohash-sha256
, data-default <0.8.0 , data-default <0.8.0
, data-default-class <0.2 , data-default-class <0.2
, directory , directory
@@ -170,6 +183,7 @@ test-suite hq-sample-test
, mongoDB , mongoDB
, mtl , mtl
, optics , optics
, random
, resource-pool , resource-pool
, servant , servant
, servant-server , servant-server

View File

@@ -20,6 +20,7 @@ default-extensions:
- FlexibleInstances - FlexibleInstances
- UndecidableInstances - UndecidableInstances
- ScopedTypeVariables - ScopedTypeVariables
- DuplicateRecordFields
dependencies: dependencies:
- base - base
@@ -53,6 +54,9 @@ dependencies:
- data-default-class < 0.2 - data-default-class < 0.2
- data-default < 0.8.0 - data-default < 0.8.0
- random
- cryptohash-sha256
library: library:
source-dirs: src source-dirs: src
dependencies: dependencies:

View File

@@ -0,0 +1,16 @@
module Data.Model.AudioRequest where
import Data.Persist.Tap (TapId)
import Data.State.Queue (QueueId)
import Data.Text (Text)
import Data.Types
import GHC.Generics (Generic)
data AudioRequest = AudioRequest
{ tapId :: TapId
, queueId :: QueueId
, trackContent :: TrackContent
, trackParameters :: TrackParameters
, volume :: Volume
}
deriving (Show, Eq, Generic)

View File

@@ -0,0 +1,27 @@
module Data.Model.TrackRequest where
import Data.Persist.Tap (TapId)
import Data.State.Track (TrackId)
import Data.Text (Text)
import Data.Types (TrackContent, TrackParameters, Volume)
import GHC.Generics (Generic)
newtype TrackToken = TrackToken Text
deriving (Show, Eq, Generic)
data TrackRequestMeta = TrackRequestMeta
{ tapId :: TapId
, trackId :: TrackId
, trackToken :: TrackToken
, volume :: Volume
}
deriving (Show, Eq, Generic)
data TrackRequest = TrackRequest
{ tapId :: TapId
, trackId :: TrackId
, trackToken :: TrackToken
, parameters :: TrackParameters
, content :: TrackContent
}
deriving (Show, Eq, Generic)

7
src/Data/State/Queue.hs Normal file
View File

@@ -0,0 +1,7 @@
module Data.State.Queue where
import Data.Text (Text)
import GHC.Generics (Generic)
newtype QueueId = QueueId Text
deriving (Show, Eq, Generic)

View File

@@ -1,12 +1,13 @@
module Data.State.Track where module Data.State.Track where
import Data.Aeson (FromJSON, ToJSON) import Data.Aeson (FromJSON, ToJSON)
import Data.Text (Text)
import Data.Word (Word64) import Data.Word (Word64)
import GHC.Generics (Generic) import GHC.Generics (Generic)
newtype TrackId = TrackId Word64 newtype TrackId = TrackId Text
deriving stock (Show, Eq, Ord, Generic) deriving stock (Show, Eq, Ord, Generic)
deriving newtype (ToJSON, FromJSON) deriving newtype (ToJSON, FromJSON)
data Track = Track {trackId :: TrackId} newtype Track = Track {trackId :: TrackId}
deriving (Show, Eq, Ord, Generic) deriving (Show, Eq, Ord, Generic)

View File

@@ -1,4 +1,4 @@
module Data.Types (UserId (..)) where module Data.Types (UserId (..), Volume (..), TrackContent (..), TrackParameters (..)) where
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text as T import qualified Data.Text as T
@@ -8,6 +8,15 @@ import Serialize.Str
newtype UserId = Discord Text newtype UserId = Discord Text
deriving (Show, Eq, Generic) deriving (Show, Eq, Generic)
newtype Volume = Volume Integer
deriving (Show, Eq, Generic)
newtype TrackContent = TrackContent Text
deriving (Show, Eq, Generic)
newtype TrackParameters = TrackParameters Text
deriving (Show, Eq, Generic)
instance StrTrans UserId where instance StrTrans UserId where
toStr userId = case userId of toStr userId = case userId of
Discord discordId -> "d:" <> discordId Discord discordId -> "d:" <> discordId

View File

@@ -0,0 +1,32 @@
module Data.Util.TrackIdGen (generateTrackId, generateTrackToken) where
import Control.Monad (replicateM)
import Data.Model.TrackRequest (HashedTrackToken, TrackToken (TrackToken))
import Data.State.Track (TrackId (TrackId))
import Data.Text (Text)
import qualified Data.Text as T
import System.Random (randomRIO)
trackIdLen :: Int
trackIdLen = 32
tokenLen :: Int
tokenLen = 32
alphanumericChars :: [Char]
alphanumericChars = ['a' .. 'z'] ++ ['A' .. 'Z'] ++ ['0' .. '9']
generateAlphanumeric :: Int -> IO Text
generateAlphanumeric len = do
let charCount = length alphanumericChars
randomIndices <- replicateM len $ randomRIO (0, charCount - 1)
let randomString = (alphanumericChars !!) <$> randomIndices
return $ T.pack randomString
generateTrackId :: IO TrackId
generateTrackId = TrackId <$> generateAlphanumeric trackIdLen
generateTrackToken :: IO TrackToken
generateTrackToken = TrackToken <$> generateAlphanumeric tokenLen

View File

@@ -0,0 +1,13 @@
module Domain.AudioRequest where
import Data.Model.AudioRequest (AudioRequest)
import Data.State.Track (TrackId)
import Data.Util.TrackIdGen (generateTrackId, generateTrackToken)
import Infrastructure.App (AppM)
processAudioRequest :: AudioRequest -> AppM TrackId
processAudioRequest = do
trackId <- generateTrackId
trackToken <- generateTrackToken
-- TODO