diff --git a/.gitignore b/.gitignore index 40d1b7d..4a918db 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ build .DS_Store node_modules + +.env diff --git a/bin/slash/main.go b/bin/slash/main.go index cf094ee..42e9e4f 100644 --- a/bin/slash/main.go +++ b/bin/slash/main.go @@ -11,7 +11,6 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "go.uber.org/zap" - _ "modernc.org/sqlite" "github.com/yourselfhosted/slash/internal/log" "github.com/yourselfhosted/slash/server" diff --git a/frontend/web/index.html b/frontend/web/index.html index 34ed763..a21e333 100644 --- a/frontend/web/index.html +++ b/frontend/web/index.html @@ -5,8 +5,8 @@ - Slash + Slash
diff --git a/go.mod b/go.mod index 6af092c..646bb3e 100644 --- a/go.mod +++ b/go.mod @@ -10,9 +10,9 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - golang.org/x/crypto v0.17.0 - golang.org/x/net v0.19.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.18.0 + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect ) @@ -53,14 +53,14 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/tools v0.16.1 // indirect - google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect + google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.41.0 // indirect modernc.org/ccgo/v3 v3.16.15 // indirect - modernc.org/libc v1.38.0 // indirect + modernc.org/libc v1.40.1 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.7.2 // indirect modernc.org/opt v0.1.3 // indirect @@ -71,18 +71,19 @@ require ( require ( github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 github.com/h2non/filetype v1.1.3 github.com/improbable-eng/grpc-web v0.15.0 + github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 github.com/mssola/useragent v1.0.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/errors v0.9.1 github.com/posthog/posthog-go v0.0.0-20230801140217-d607812dee69 go.uber.org/zap v1.26.0 - golang.org/x/exp v0.0.0-20231226003508-02704c960a9b + golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc golang.org/x/mod v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 + google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.32.0 modernc.org/sqlite v1.28.0 diff --git a/go.sum b/go.sum index 196c1df..388c0c6 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -182,6 +182,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -414,13 +416,13 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20231226003508-02704c960a9b h1:kLiC65FbiHWFAOu+lxwNPujcsl8VYyTYYEZnsOO1WK4= -golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -453,8 +455,8 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -494,8 +496,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -538,12 +540,12 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 h1:/IWabOtPziuXTEtI1KYCpM6Ss7vaAkeMxk+uXV/xvZs= +google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 h1:OPXtXn7fNMaXwO3JvOmF1QyTc00jsSFFz1vXXBOdCDo= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -613,8 +615,8 @@ modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.38.0 h1:o4Lpk0zNDSdsjfEXnF1FGXWQ9PDi1NOdWcLP5n13FGo= -modernc.org/libc v1.38.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/libc v1.40.1 h1:ZhRylEBcj3GyQbPVC8JxIg7SdrT4JOxIDJoUon0NfF8= +modernc.org/libc v1.40.1/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= diff --git a/server/embed_frontend.go b/server/embed_frontend.go index a8c40ab..9cb31c2 100644 --- a/server/embed_frontend.go +++ b/server/embed_frontend.go @@ -3,7 +3,6 @@ package server import ( "context" "fmt" - "html/template" "net/http" "os" "strings" @@ -17,6 +16,10 @@ import ( "github.com/yourselfhosted/slash/store" ) +const ( + headerMetadataPlaceholder = "" +) + type FrontendService struct { Profile *profile.Profile Store *store.Store @@ -61,7 +64,7 @@ func (s *FrontendService) registerRoutes(e *echo.Echo) { } // Inject shortcut metadata into `index.html`. - indexHTML := strings.ReplaceAll(rawIndexHTML, "", generateShortcutMetadata(shortcut)) + indexHTML := strings.ReplaceAll(rawIndexHTML, headerMetadataPlaceholder, generateShortcutMetadata(shortcut).String()) return c.HTML(http.StatusOK, indexHTML) }) @@ -79,7 +82,7 @@ func (s *FrontendService) registerRoutes(e *echo.Echo) { } // Inject collection metadata into `index.html`. - indexHTML := strings.ReplaceAll(rawIndexHTML, "", generateCollectionMetadata(collection)) + indexHTML := strings.ReplaceAll(rawIndexHTML, headerMetadataPlaceholder, generateCollectionMetadata(collection).String()) return c.HTML(http.StatusOK, indexHTML) }) } @@ -132,7 +135,8 @@ Sitemap: %s/sitemap.xml`, instanceURL, instanceURL) }) } -func generateShortcutMetadata(shortcut *storepb.Shortcut) string { +func generateShortcutMetadata(shortcut *storepb.Shortcut) *Metadata { + metadata := getDefaultMetadata() title, description := shortcut.Title, shortcut.Description if shortcut.OgMetadata != nil { if shortcut.OgMetadata.Title != "" { @@ -141,38 +145,49 @@ func generateShortcutMetadata(shortcut *storepb.Shortcut) string { if shortcut.OgMetadata.Description != "" { description = shortcut.OgMetadata.Description } + metadata.ImageURL = shortcut.OgMetadata.Image } - - metadataList := []string{ - fmt.Sprintf(``, template.HTMLEscapeString(description)), - fmt.Sprintf(``, template.HTMLEscapeString(title)), - fmt.Sprintf(``, template.HTMLEscapeString(description)), - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Image)), - ``, - // Twitter related metadata. - fmt.Sprintf(``, template.HTMLEscapeString(title)), - fmt.Sprintf(``, template.HTMLEscapeString(description)), - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Image)), - ``, - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.Link)), - } - return strings.Join(metadataList, "\n") + metadata.Title = title + metadata.Description = description + return metadata } -func generateCollectionMetadata(collection *storepb.Collection) string { - metadataList := []string{ - fmt.Sprintf(``, template.HTMLEscapeString(collection.Description)), - fmt.Sprintf(``, template.HTMLEscapeString(collection.Title)), - fmt.Sprintf(``, template.HTMLEscapeString(collection.Description)), - ``, - // Twitter related metadata. - fmt.Sprintf(``, template.HTMLEscapeString(collection.Title)), - fmt.Sprintf(``, template.HTMLEscapeString(collection.Description)), - } - return strings.Join(metadataList, "\n") +func generateCollectionMetadata(collection *storepb.Collection) *Metadata { + metadata := getDefaultMetadata() + metadata.Title = collection.Title + metadata.Description = collection.Description + return metadata } func getRawIndexHTML() string { bytes, _ := os.ReadFile("dist/index.html") return string(bytes) } + +type Metadata struct { + Title string + Description string + ImageURL string +} + +func getDefaultMetadata() *Metadata { + return &Metadata{ + Title: "Slash", + } +} + +func (m *Metadata) String() string { + metadataList := []string{ + fmt.Sprintf(`%s`, m.Title), + fmt.Sprintf(``, m.Description), + fmt.Sprintf(``, m.Title), + fmt.Sprintf(``, m.Description), + fmt.Sprintf(``, m.ImageURL), + ``, + // Twitter related fields. + fmt.Sprintf(``, m.Title), + fmt.Sprintf(``, m.Description), + fmt.Sprintf(``, m.ImageURL), + } + return strings.Join(metadataList, "\n") +} diff --git a/store/db/postgres/migrator.go b/store/db/postgres/migrator.go index 7b2aa6a..f3b1773 100644 --- a/store/db/postgres/migrator.go +++ b/store/db/postgres/migrator.go @@ -22,9 +22,6 @@ const ( //go:embed migration var migrationFS embed.FS -//go:embed seed -var seedFS embed.FS - func (d *DB) Migrate(ctx context.Context) error { if d.profile.IsDev() { return d.nonProdMigrate(ctx) @@ -67,12 +64,6 @@ func (d *DB) nonProdMigrate(ctx context.Context) error { return errors.Errorf("failed to exec SQL %s: %s", stmt, err) } - // In demo mode, we should seed the database. - if d.profile.Mode == "demo" { - if err := d.Seed(ctx); err != nil { - return errors.Wrap(err, "failed to seed") - } - } return nil } @@ -156,43 +147,6 @@ func (d *DB) applyMigrationForMinorVersion(ctx context.Context, minorVersion str return nil } -func (d *DB) Seed(ctx context.Context) error { - filenames, err := fs.Glob(seedFS, fmt.Sprintf("%s/*.sql", "seed")) - if err != nil { - return errors.Wrap(err, "failed to read seed files") - } - - sort.Strings(filenames) - - // Loop over all seed files and execute them in order. - for _, filename := range filenames { - buf, err := seedFS.ReadFile(filename) - if err != nil { - return errors.Wrapf(err, "failed to read seed file, filename=%s", filename) - } - stmt := string(buf) - if err := d.execute(ctx, stmt); err != nil { - return errors.Wrapf(err, "seed error: %s", stmt) - } - } - return nil -} - -// execute runs a single SQL statement within a transaction. -func (d *DB) execute(ctx context.Context, stmt string) error { - tx, err := d.db.Begin() - if err != nil { - return err - } - defer tx.Rollback() - - if _, err := tx.ExecContext(ctx, stmt); err != nil { - return errors.Wrap(err, "failed to execute statement") - } - - return tx.Commit() -} - // minorDirRegexp is a regular expression for minor version directory. var minorDirRegexp = regexp.MustCompile(`^migration/prod/[0-9]+\.[0-9]+$`) diff --git a/store/db/postgres/seed/10000__reset.sql b/store/db/postgres/seed/10000__reset.sql deleted file mode 100644 index e69de29..0000000 diff --git a/store/db/sqlite/seed/10000__reset.sql b/store/db/sqlite/seed/10000__reset.sql deleted file mode 100644 index 79be1d8..0000000 --- a/store/db/sqlite/seed/10000__reset.sql +++ /dev/null @@ -1,9 +0,0 @@ -DELETE FROM activity; - -DELETE FROM shortcut; - -DELETE FROM user_setting; - -DELETE FROM user; - -DELETE FROM workspace_setting; diff --git a/store/db/sqlite/seed/10001__user.sql b/store/db/sqlite/seed/10000__user.sql similarity index 100% rename from store/db/sqlite/seed/10001__user.sql rename to store/db/sqlite/seed/10000__user.sql diff --git a/store/db/sqlite/seed/10002__shortcut.sql b/store/db/sqlite/seed/10001__shortcut.sql similarity index 100% rename from store/db/sqlite/seed/10002__shortcut.sql rename to store/db/sqlite/seed/10001__shortcut.sql diff --git a/store/db/sqlite/seed/10003__collection.sql b/store/db/sqlite/seed/10002__collection.sql similarity index 100% rename from store/db/sqlite/seed/10003__collection.sql rename to store/db/sqlite/seed/10002__collection.sql diff --git a/store/db/sqlite/sqlite.go b/store/db/sqlite/sqlite.go index 09c3e29..4a0261c 100644 --- a/store/db/sqlite/sqlite.go +++ b/store/db/sqlite/sqlite.go @@ -4,6 +4,8 @@ import ( "database/sql" "github.com/pkg/errors" + // SQLite driver. + _ "modernc.org/sqlite" "github.com/yourselfhosted/slash/server/profile" "github.com/yourselfhosted/slash/store" diff --git a/store/driver.go b/store/driver.go index 5099aa9..b29656e 100644 --- a/store/driver.go +++ b/store/driver.go @@ -14,7 +14,6 @@ type Driver interface { Close() error Migrate(ctx context.Context) error - Seed(ctx context.Context) error // MigrationHistory model related methods. UpsertMigrationHistory(ctx context.Context, upsert *UpsertMigrationHistory) (*MigrationHistory, error) diff --git a/test/server/server.go b/test/server/server.go index b553a0b..f22f07e 100644 --- a/test/server/server.go +++ b/test/server/server.go @@ -11,8 +11,6 @@ import ( "time" "github.com/pkg/errors" - // sqlite driver. - _ "modernc.org/sqlite" "github.com/yourselfhosted/slash/api/auth" "github.com/yourselfhosted/slash/server" diff --git a/test/store/store.go b/test/store/store.go index bf32e13..12ef436 100644 --- a/test/store/store.go +++ b/test/store/store.go @@ -5,9 +5,7 @@ import ( "fmt" "testing" - // sqlite driver. - _ "modernc.org/sqlite" - + "github.com/yourselfhosted/slash/server/profile" "github.com/yourselfhosted/slash/store" "github.com/yourselfhosted/slash/store/db" test "github.com/yourselfhosted/slash/test" @@ -19,15 +17,29 @@ func NewTestingStore(ctx context.Context, t *testing.T) *store.Store { if err != nil { fmt.Printf("failed to create db driver, error: %+v\n", err) } + resetTestingDB(ctx, profile, dbDriver) if err := dbDriver.Migrate(ctx); err != nil { fmt.Printf("failed to migrate db, error: %+v\n", err) } - if profile.Driver == "postgres" { - if err := dbDriver.Seed(ctx); err != nil { - fmt.Printf("failed to seed db, error: %+v\n", err) - } - } store := store.New(dbDriver, profile) return store } + +func resetTestingDB(ctx context.Context, profile *profile.Profile, dbDriver store.Driver) { + if profile.Driver == "postgres" { + _, err := dbDriver.GetDB().ExecContext(ctx, ` + DROP TABLE IF EXISTS migration_history CASCADE; + DROP TABLE IF EXISTS workspace_setting CASCADE; + DROP TABLE IF EXISTS "user" CASCADE; + DROP TABLE IF EXISTS user_setting CASCADE; + DROP TABLE IF EXISTS shortcut CASCADE; + DROP TABLE IF EXISTS activity CASCADE; + DROP TABLE IF EXISTS collection CASCADE; + DROP TABLE IF EXISTS memo CASCADE;`) + if err != nil { + fmt.Printf("failed to reset testing db, error: %+v\n", err) + panic(err) + } + } +} diff --git a/test/test.go b/test/test.go index 8266a81..4ab33d6 100644 --- a/test/test.go +++ b/test/test.go @@ -6,6 +6,8 @@ import ( "os" "testing" + "github.com/joho/godotenv" + "github.com/yourselfhosted/slash/server/profile" "github.com/yourselfhosted/slash/server/version" ) @@ -24,6 +26,10 @@ func getUnusedPort() int { } func GetTestingProfile(t *testing.T) *profile.Profile { + if err := godotenv.Load(".env"); err != nil { + t.Log("failed to load .env file, but it's ok") + } + // Get a temporary directory for the test data. dir := t.TempDir() mode := "dev"