From db412bd3741f5c271f5ebfc0bd37dde5af201d66 Mon Sep 17 00:00:00 2001 From: Saku Laesvuori Date: Sat, 9 Sep 2023 17:43:32 +0300 Subject: [PATCH] Migrate and setup database automatically --- .guix/modules/datarekisteri-package.scm | 244 +++++++++++++++++++++++- datarekisteri.cabal | 8 +- src/Client.hs | 3 +- src/Server.hs | 12 +- 4 files changed, 263 insertions(+), 4 deletions(-) diff --git a/.guix/modules/datarekisteri-package.scm b/.guix/modules/datarekisteri-package.scm index f35d228..9ffc6d4 100644 --- a/.guix/modules/datarekisteri-package.scm +++ b/.guix/modules/datarekisteri-package.scm @@ -1,10 +1,13 @@ (define-module (datarekisteri-package) #:use-module (guix) + #:use-module (guix build-system go) #:use-module (guix build-system haskell) #:use-module (guix download) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) + #:use-module (gnu packages golang) + #:use-module (gnu packages syncthing) #:use-module (gnu packages haskell) #:use-module (gnu packages haskell-check) #:use-module (gnu packages haskell-crypto) @@ -23,7 +26,8 @@ #:recursive? #t #:select? vcs-file?)) (build-system haskell-build-system) - (inputs (list ghc-base64 + (inputs (list dbmate + ghc-base64 ghc-cryptonite ghc-email-validate ghc-esqueleto @@ -39,6 +43,15 @@ ghc-yesod ghc-yesod-static ghc-yesod-auth)) + (arguments + (list + #:phases + #~(modify-phases %standard-phases + (add-after 'install 'wrap-binaries + (lambda _ + (wrap-program + (string-append #$output "/bin/datarekisteri") + `("PATH" prefix (,(string-append #$(this-package-input "dbmate") "/bin"))))))))) (home-page "") (synopsis "") (description "") @@ -691,4 +704,233 @@ please see: .") README for more information.") (license license:bsd-3))) +(define-public go-github-com-jmoiron-sqlx + (package + (name "go-github-com-jmoiron-sqlx") + (version "1.3.5") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/jmoiron/sqlx") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "09snd3gfi3sm3gib7jdc6p8zxpn2ah0isqnibbag6f63k473yj14")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/jmoiron/sqlx")) + (propagated-inputs + (list go-github-com-mattn-go-sqlite3 + go-github-com-lib-pq + go-github-com-go-sql-driver-mysql)) + (home-page "https://github.com/jmoiron/sqlx") + (synopsis "sqlx") + (description + "Package sqlx provides general purpose extensions to database/sql.") + (license license:expat))) + +(define-public go-github-com-pierrec-lz4 + (package + (name "go-github-com-pierrec-lz4") + (version "v2.0.5+incompatible") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/pierrec/lz4") + (commit (go-version->git-ref version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0y5rh7z01zycd59nnjpkqq0ydyjmcg9j1xw15q1i600l9j9g617p")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/pierrec/lz4")) + (home-page "https://github.com/pierrec/lz4") + (synopsis "lz4 : LZ4 compression in pure Go") + (description + "Package lz4 implements reading and writing lz4 compressed data (a frame), as +specified in +@url{http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html,http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html}.") + (license license:bsd-3))) + +(define-public go-github-com-clickhouse-clickhouse-go + (package + (name "go-github-com-clickhouse-clickhouse-go") + (version "1.5.4") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/ClickHouse/clickhouse-go") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "15yf96mx3fkjyyasb8gjw6ml476k9qacp54bdjrb14pafz3p3rgf")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/ClickHouse/clickhouse-go" + #:tests? #f)) + (propagated-inputs + (list go-github-com-stretchr-testify + go-github-com-pierrec-lz4 + go-github-com-jmoiron-sqlx + go-github-com-cloudflare-golz4 + go-github-com-bkaradzic-go-lz4)) + (home-page "https://github.com/ClickHouse/clickhouse-go") + (synopsis "ClickHouse") + (description + "Golang SQL database driver for @url{https://clickhouse.yandex/,Yandex +ClickHouse}") + (license license:expat))) + +(define-public go-github-com-joho-godotenv + (package + (name "go-github-com-joho-godotenv") + (version "1.4.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/joho/godotenv") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1036h59vyhb58n817az6yg0zw5wa87yb86i7fnbdq8cw46mnjgw8")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/joho/godotenv")) + (home-page "https://github.com/joho/godotenv") + (synopsis "GoDotEnv") + (description + "Package godotenv is a go port of the ruby dotenv library +(@url{https://github.com/bkeepers/dotenv,https://github.com/bkeepers/dotenv})") + (license license:expat))) + +(define-public go-github-com-kami-zh-go-capturer + (package + (name "go-github-com-kami-zh-go-capturer") + (version "0.0.0-20211219060012-52ea6c8fed04") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/zenizh/go-capturer") + (commit (go-version->git-ref version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0zwz9gr1863z32gz9nyysg66mg124w6nql4m99g2dg6fbq2klda4")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/kami-zh/go-capturer")) + (home-page "https://github.com/kami-zh/go-capturer") + (synopsis "go-capturer") + (description + "Capture @code{os.Stdout} and/or @code{os.Stderr} in Go. This package is useful +for writing tests which print some outputs using @code{fmt} package.") + (license license:expat))) + +(define-public go-github-com-cloudflare-golz4 + (package + (name "go-github-com-cloudflare-golz4") + (version "0.0.0-20150217214814-ef862a3cdc58") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/cloudflare/golz4") + (commit (go-version->git-ref version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0ckiwp3aa010sdnki6vd32f0n08768ppnggc8d7syzh3kkn9zvn1")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/cloudflare/golz4" + #:tests? #f)) + (home-page "https://github.com/cloudflare/golz4") + (synopsis "golz4") + (description "Package lz4 implements compression using lz4.c and lz4hc.c") + (license license:bsd-3))) + +(define-public go-github-com-cpuguy83-go-md2man-v2 + (package + (name "go-github-com-cpuguy83-go-md2man-v2") + (version "2.0.2") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/cpuguy83/go-md2man") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "19qri18cinpzxblkid6ngz2vcxslv73s1aid900q0gfzvc71mqqb")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/cpuguy83/go-md2man/v2")) + (propagated-inputs (list go-github-com-russross-blackfriday-v2)) + (home-page "https://github.com/cpuguy83/go-md2man") + (synopsis "go-md2man") + (description "Converts markdown into roff (man pages).") + (license license:expat))) + +(define-public go-github-com-russross-blackfriday-v2 + (package + (name "go-github-com-russross-blackfriday-v2") + (version "2.1.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/russross/blackfriday") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0d1rg1drrfmabilqjjayklsz5d0n3hkf979sr3wsrw92bfbkivs7")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/russross/blackfriday/v2")) + (home-page "https://github.com/russross/blackfriday") + (synopsis "Blackfriday") + (description "Package blackfriday is a markdown processor.") + (license license:bsd-2))) + +(define-public dbmate + (package + (name "dbmate") + (version "1.15.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/amacneil/dbmate") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1dbhm2aqppn4m55xnx18017shsy109hqv2nhksxb4ix83bjaq5vq")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/amacneil/dbmate")) + (propagated-inputs + (list go-gopkg-in-yaml-v3 + go-github-com-russross-blackfriday-v2 + go-github-com-pmezard-go-difflib + go-github-com-davecgh-go-spew + go-github-com-cpuguy83-go-md2man-v2 + go-github-com-cloudflare-golz4 + go-github-com-urfave-cli-v2 + go-github-com-stretchr-testify + go-github-com-mattn-go-sqlite3 + go-github-com-lib-pq + go-github-com-kami-zh-go-capturer + go-github-com-joho-godotenv + go-github-com-go-sql-driver-mysql + go-github-com-clickhouse-clickhouse-go)) + (home-page "https://github.com/amacneil/dbmate") + (synopsis "Sql database migration tool") + (description + "Dbmate is a database migration tool, to keep your database schema in sync across +multiple developers and your production servers.") + (license license:expat))) + datarekisteri diff --git a/datarekisteri.cabal b/datarekisteri.cabal index f8542b6..689f5b3 100644 --- a/datarekisteri.cabal +++ b/datarekisteri.cabal @@ -6,6 +6,8 @@ license: AGPL-3.0-or-later license-file: COPYING.md build-type: Simple stability: alpha +data-files: + db/migrations/*.sql executable datarekisteri build-depends: @@ -26,6 +28,7 @@ executable datarekisteri mtl, persistent, persistent-postgresql, + process, relude, scotty, smtp-mail, @@ -58,6 +61,9 @@ executable datarekisteri Server.DB.Queries, Server.Email, Server.Types, - Server.Utils + Server.Utils, + Paths_datarekisteri + autogen-modules: + Paths_datarekisteri hs-source-dirs: src default-language: Haskell2010 diff --git a/src/Client.hs b/src/Client.hs index b5b3423..8390f8e 100644 --- a/src/Client.hs +++ b/src/Client.hs @@ -19,12 +19,13 @@ import Client.Types import Client.Handlers import Client.Auth () import Yesod.Static (static, Static) +import Server (runMigrations) import System.Directory (createDirectoryIfMissing) mkYesodDispatch "DataIdClient" resourcesDataIdClient main :: IO () -main = getStaticDir "/tmp/data-id" >>= warp 3000 . DataIdClient +main = runMigrations >> getStaticDir "/tmp/data-id" >>= warp 3000 . DataIdClient getStaticDir :: FilePath -> IO Static getStaticDir dir = createDirectoryIfMissing True dir >> static dir diff --git a/src/Server.hs b/src/Server.hs index 91b0acd..d6cd4ea 100644 --- a/src/Server.hs +++ b/src/Server.hs @@ -25,12 +25,22 @@ import Server.DB import Server.DB.Queries (getUserByEmail, getPermissions, getToken) import Server.Types import Server.Utils (checkPassword) +import System.Process (callProcess) import Web.Scotty.Trans hiding (readEither) import qualified "base64" Data.ByteString.Base64 as B64 (decodeBase64) +import Paths_datarekisteri main :: IO () main = run 3100 =<< serverApp +dbUrl :: IsString a => a +dbUrl = "postgres:///id.rekisteri" + +runMigrations :: IO () +runMigrations = do + migrationsPath <- getDataFileName "db/migrations" + callProcess "dbmate" ["--url", dbUrl, "--migrations-dir", migrationsPath, "up"] + serverApp :: IO Application serverApp = scottyAppT runAPIM $ do middleware $ gzip def @@ -119,7 +129,7 @@ instance MonadTime APIM where currentTime = liftIO currentTime instance MonadDB APIM where - runQuery = liftIO . runStderrLoggingT . withPostgresqlConn "postgres:///id.rekisteri" . runSqlConn + runQuery = liftIO . runStderrLoggingT . withPostgresqlConn dbUrl . runSqlConn instance MonadEmail APIM where sendEmail = liftIO . renderSendMail