@@ -13,7 +13,9 @@ import Control.Concurrent (myThreadId)
13
13
import Control.Concurrent.Async (concurrently )
14
14
import Control.Monad
15
15
import Control.Monad.IO.Class
16
- import Control.Monad.Trans.Except (ExceptT (.. ), runExceptT , withExceptT )
16
+ import Control.Monad.Trans.Except (ExceptT (.. ), runExceptT )
17
+ import Data.Aeson ((.=) )
18
+ import qualified Data.Aeson as Aeson
17
19
import Data.ByteString (ByteString )
18
20
import qualified Data.ByteString as BS
19
21
import qualified Data.ByteString.Char8 as BS8
@@ -27,6 +29,7 @@ import Data.Maybe (fromMaybe)
27
29
import Data.String (fromString )
28
30
import Data.Text (Text )
29
31
import qualified Data.Text as Text
32
+ import qualified Data.Time.Clock.System as Time
30
33
import Database.SQLite.Simple
31
34
import Database.SQLite.Simple.FromField (FromField (.. ), Field , returnError , fieldData )
32
35
import Database.SQLite.Simple.ToField (ToField (.. ))
@@ -119,7 +122,8 @@ newtype ProgramDB = ProgramDB {unProgramDB :: FilePath}
119
122
data ServerConfig = ServerConfig
120
123
{ _programDB :: ProgramDB ,
121
124
_applicationDB :: ApplicationDB ,
122
- _port :: Port
125
+ _port :: Port ,
126
+ _logdir :: FilePath
123
127
}
124
128
deriving (Show )
125
129
@@ -129,18 +133,34 @@ data ServerConfig = ServerConfig
129
133
-- 2. Building the triplet
130
134
-- If an error occurs, this is returned as a 400
131
135
server :: ServerConfig -> Server API
132
- server (ServerConfig programDB appDB _) =
136
+ server (ServerConfig programDB appDB _ logdir ) =
133
137
redirectToDocs
134
138
:<|> (\ bin -> handle bin Nothing )
135
139
:<|> (\ pkg bin -> handle bin (Just pkg))
136
140
where
137
141
handle :: BinaryName -> Maybe PackageName -> Maybe Platform -> Maybe NixpkgsCommit -> Handler BSL. ByteString
138
- handle bin mpkg msys mcommit =
139
- Handler . withExceptT ( \ err -> err400 {errBody = BSL. pack err}) $ do
142
+ handle bin mpkg msys mcommit = Handler $ do
143
+ mbin <- liftIO . runExceptT $ do
140
144
commit <- resolveCommit mcommit
141
145
let sys = fromMaybe X86_64_Linux msys
142
146
pkg <- maybe (resolvePackageName programDB bin sys) pure mpkg
143
147
buildTriplet appDB (BinInfo bin pkg sys commit)
148
+ liftIO $ do
149
+ time <- Time. systemSeconds <$> Time. getSystemTime
150
+ Dir. createDirectoryIfMissing True logdir
151
+ let logstring =
152
+ Aeson. encode . Aeson. object $
153
+ [ " time" .= time,
154
+ " binary" .= unBinaryName bin,
155
+ " package" .= maybe Aeson. Null (Aeson. String . Text. pack . unPackageName) mpkg,
156
+ " platform" .= maybe Aeson. Null (Aeson. String . Text. pack . show ) msys,
157
+ " commit" .= maybe Aeson. Null (Aeson. String . unNixpkgsCommit) mcommit,
158
+ " result" .= either (Aeson. String . Text. pack) (const " success" ) mbin
159
+ ]
160
+ Lazy. appendFile (logdir </> " requests.log" ) (logstring <> " \n " )
161
+ case mbin of
162
+ Left err -> throwError (err400 {errBody = BSL. pack err})
163
+ Right ok -> pure ok
144
164
145
165
-- | The default Nixpkgs commit we use when the user doesn't provide one.
146
166
--
0 commit comments