64C6AWH66FDKU6UE6Z6JPX2J2GBM2JOPTH2GL6LHKAIUBGNGDZ5AC RSEB2NFGUBTFESE5BJKDUVQL5Y5ZVGY5O4CJX2LNP63MS3NRHHZQC AXKKXBWN4EMUOLV43WN52JSKJPBV7TLSGLNJW5EZXHSJNKCYUWOQC ADMKQQGCGVSHHIMVQ4XFRDCG544SBJCYALSKZV45CQQBZ4ACUH2AC NVOCQVASZWTKQJG7GPH7KHKZZR7NUG4WLV5YY4KAIRPCJRWCZPIAC EQXRXRZDYCM7BDAVBOXQYPG6C7IJT3OFGNIXCDAHJJBRKAXNGL7AC NMWWP4ZNOKHZKSJ6F5KYEREWXXR5F4UD35WOKI3EH42AZWVCTCJAC GKGVYBZGPJXO7N7GLHLRNYQPXFHBQSNQN53OKRFCXLQEYDTC5I4QC N4NDAZYTLSI2W22KT3SYXL257DBMSH3UT2BXOYM7LH7FSZAY4RLAC P6NR2CGXCWAW6GXXSIXCGOBIRAS2BM4LEM6D5ADPN4IL7TMW6UVAC 2OIPAQCBDIUJBXB4K2QVP3IEBIUOCQHSWSWFVMVSVZC7GHX2VK7AC Y35QCWYW2OTZ27ZVTH2BA3XJTUCJ2WMLKU32ZCOCDY3AW7TIZXRAC Name: anankeVersion: 0.1Synopsis: The Ananke Collaboration PlatformDescription: A service to enable groups of trusted contributors to be paid for their efforts in collaboratively developing commercial applications.License: AllRightsReservedAuthor: Kris NuttycombeMaintainer: kris@hylotech.comStability: ExperimentalCategory: WebBuild-type: Simplelibrarydefault-language: Haskell2010hs-source-dirs: srcTest-Suite specdefault-language: Haskell2010type: exitcode-stdio-1.0ghc-options: -Wall -Werrorhs-source-dirs: testmain-is: Spec.hsExecutable ananke-serverdefault-language: Haskell2010ghc-options: -Wall -Werrorhs-source-dirs: servermain-is: Main.hsbuild-depends: base, text, time, mtl, bytestring >= 0.9.1 && < 0.11, scotty >=0.7 && <0.8, sqlite == 0.5.2.2, anankebuild-depends: base, hspec >= 1.8.1, ananke, aeson, bifunctors, containers, iso8601-time, text, timeexposed-modules: AnankeAnanke.TimeLogAnanke.Intervalbuild-depends: base >= 4.4 && < 5, lens >= 3.7.6 && < 3.11, bifunctors, aeson >= 0.7.0.2, text >= 0.11 && < 0.12, time >= 1.1 && < 1.5, iso8601-time == 0.1.1, containers == 0.5.*ghc-options: -Wall -WerrorCabal-version: >= 1.20
Name: quixoticVersion: 0.1Synopsis: The Quixotic Collaboration PlatformDescription: A service to enable groups of trusted contributors to be paid for their effortsin collaboratively developing commercial applications.License: AllRightsReservedAuthor: Kris NuttycombeMaintainer: kris@nutty.langStability: ExperimentalCategory: WebBuild-type: SimpleCabal-version: >= 1.20librarydefault-language: Haskell2010ghc-options: -Wall -Werrorhs-source-dirs: srcexposed-modules: QuixoticQuixotic.DatabaseQuixotic.Database.SQLiteQuixotic.IntervalQuixotic.TimeLogbuild-depends: base >= 4.7.0.1, bifunctors, aeson >= 0.8.0.2, cassandra-cql >= 0.4.0.1, containers >= 0.5.5.1, either >= 4.3.1, lens >= 4.4.0.2, old-locale, sqlite == 0.5.2.2, text >= 1.2.0.0, time >= 1.4.2 && < 1.5Test-Suite specdefault-language: Haskell2010type: exitcode-stdio-1.0ghc-options: -Wall -Werrorhs-source-dirs: testmain-is: Spec.hsbuild-depends: quixotic, base, aeson, containers, text, time, hspec >= 1.8.1Executable quixotic-serverdefault-language: Haskell2010ghc-options: -Wall -Werrorhs-source-dirs: servermain-is: Main.hsbuild-depends: quixotic, base, aeson, containers, either, mtl, text, time, optparse-applicative >= 0.9.0 && < 0.10, bytestring >= 0.9.1 && < 0.11, scotty >= 0.9.0
import Data.Text.Lazy
import Control.Monadimport Control.Monad.Trans (liftIO)import Control.Monad.Trans.Eitherimport qualified Data.Aeson as Aimport Data.Mapimport Data.Time.Clockimport Data.Time.Formatimport Quixoticimport Quixotic.Databaseimport Quixotic.TimeLog
recordStart :: SQLiteHandle -> BtcAddr -> UTCTime -> IO ()recordStart = undefined
handleLogRequest :: ADB a -> (UTCTime -> WorkEvent) -> ActionM ()handleLogRequest db ev = doBtcAddrParam addr <- param "btcAddr"timestamp <- liftIO getCurrentTimeliftIO . recordEvent db $ LogEntry addr (ev timestamp)
eventTable :: SQLTableeventTable = Table "workEvents" [ Column "btcAddr" (SQLVarChar 256) [], Column "event" (SQLVarChar 64) [], Column "eventTime" (SQLDateTime DATETIME) [] ] []newtype BtcAddrParam = BtcAddrParam { btcAddr :: BtcAddr }
newtype BtcAddrParam = BtcAddrParam BtcAddr
parseParam t = maybe (Left "Invalid BTC address") (Right . BtcAddrParam) $ (parseBtcAddr . toStrict) t
parseParam t = maybe (Left "Invalid BTC address") (Right . BtcAddrParam) $ (parseBtcAddr . LT.toStrict) tnewtype PayoutsResponse = PayoutsResponse Payouts
instance A.ToJSON PayoutsResponse wheretoJSON (PayoutsResponse p) = A.toJSON (mapKeys address p)
module Quixotic.Database.SQLite (sqliteADB) whereimport Control.Monadimport Control.Monad.Trans.Eitherimport qualified Data.Text as Timport Data.Time.Clockimport Data.Time.Formatimport Database.SQLiteimport Quixoticimport qualified Quixotic.Database as Dimport Quixotic.TimeLogimport System.LocalesqliteADB :: String -> IO (D.ADB IO SQLiteHandle)sqliteADB dbName = dodb <- openConnection "quixotic.db"return $ D.ADB recordEvent readWorkIndexrecordEvent :: SQLiteHandle -> LogEntry -> IO ()recordEvent h (LogEntry ba ev) =void $ insertRow h "workEvents" [ ("btcAddr", T.unpack (address ba)), ("event", eventName ev), ("eventTime", formatSqlTime (logTime ev)) ]readWorkIndex :: SQLiteHandle -> EitherT String IO WorkIndexreadWorkIndex db = dorows <- EitherT $ execStatement db "SELECT btcAddr, event, eventTime from workEvents"undefinedformatSqlTime :: UTCTime -> StringformatSqlTime t = formatTime defaultTimeLocale "%c" teventTable :: SQLTableeventTable = Table "workEvents" [ Column "btcAddr" (SQLVarChar 256) [], Column "event" (SQLVarChar 64) [], Column "eventTime" (SQLDateTime DATETIME) [] ] []
module Quixotic.Database( ADB(..)) whereimport Control.Monad.Trans.Eitherimport Quixotic.TimeLogdata ADB m a = ADB{ recordEvent :: a -> LogEntry -> m (), readWorkIndex :: a -> EitherT String m WorkIndex}