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"