Skip to content
This repository has been archived by the owner on Aug 16, 2022. It is now read-only.

Commit

Permalink
fix: synchronize mongo migration (#94)
Browse files Browse the repository at this point in the history
* add lock

* remove test

* fix log

* fix mod

* fix

* remove IsLocked

* refactor rerror

* refactor transaction

* update repo.Config to use lock
  • Loading branch information
rot1024 committed Dec 23, 2021
1 parent ba4b18f commit db4ceaf
Show file tree
Hide file tree
Showing 20 changed files with 411 additions and 170 deletions.
2 changes: 2 additions & 0 deletions go.mod
Expand Up @@ -9,6 +9,7 @@ require (
github.com/blang/semver v3.5.1+incompatible
github.com/form3tech-oss/jwt-go v3.2.2+incompatible
github.com/goccy/go-yaml v1.9.4
github.com/google/uuid v1.3.0
github.com/iancoleman/strcase v0.2.0
github.com/idubinskiy/schematyper v0.0.0-20190118213059-f71b40dac30d
github.com/jarcoal/httpmock v1.0.8
Expand All @@ -25,6 +26,7 @@ require (
github.com/ravilushqa/otelgqlgen v0.2.0
github.com/sirupsen/logrus v1.8.1
github.com/spf13/afero v1.6.0
github.com/square/mongo-lock v0.0.0-20201208161834-4db518ed7fb2
github.com/stretchr/testify v1.7.0
github.com/twpayne/go-kml v1.5.2
github.com/uber/jaeger-client-go v2.29.1+incompatible
Expand Down
22 changes: 21 additions & 1 deletion go.sum
Expand Up @@ -78,6 +78,8 @@ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/auth0/go-jwt-middleware v1.0.1 h1:/fsQ4vRr4zod1wKReUH+0A3ySRjGiT9G34kypO/EKwI=
github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM=
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
github.com/aws/aws-sdk-go v1.35.5/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -146,8 +148,11 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg=
github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
Expand Down Expand Up @@ -212,6 +217,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
Expand Down Expand Up @@ -254,8 +260,9 @@ github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0 h1:zHs+jv3LO743/zFGcB
github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
Expand Down Expand Up @@ -292,6 +299,8 @@ github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k=
github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
Expand All @@ -309,6 +318,8 @@ github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8Nz
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.11.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
Expand Down Expand Up @@ -400,6 +411,8 @@ github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/square/mongo-lock v0.0.0-20201208161834-4db518ed7fb2 h1:Fod/tm/5c19889+T6j7mXxg/tEJrcLuDJxR/98raj80=
github.com/square/mongo-lock v0.0.0-20201208161834-4db518ed7fb2/go.mod h1:h98Zzl76KWv7bG0FHBMA9MAcDhwcIyE7q570tDP7CmY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
Expand Down Expand Up @@ -444,6 +457,9 @@ github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w=
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc=
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
Expand All @@ -452,6 +468,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.mongodb.org/mongo-driver v1.4.2/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
go.mongodb.org/mongo-driver v1.7.4 h1:sllcioag8Mec0LYkftYWq+cKNPIR4Kqq3iv9ZXY0g/E=
go.mongodb.org/mongo-driver v1.7.4/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
Expand Down Expand Up @@ -496,12 +513,14 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
Expand Down Expand Up @@ -611,6 +630,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
Expand Down
6 changes: 1 addition & 5 deletions internal/app/app.go
Expand Up @@ -128,11 +128,7 @@ func errorMessage(err error, log func(string, ...interface{})) (int, string) {
code = http.StatusNotFound
msg = "not found"
} else {
var ierr *rerror.ErrInternal
if errors.As(err, &ierr) {
if err2 := ierr.Unwrap(); err2 != nil {
log("internal err: %+v", err2)
}
if ierr := rerror.UnwrapErrInternal(err); ierr != nil {
code = http.StatusInternalServerError
msg = "internal server error"
}
Expand Down
9 changes: 0 additions & 9 deletions internal/app/graphql.go
Expand Up @@ -2,7 +2,6 @@ package app

import (
"context"
"errors"

"github.com/99designs/gqlgen/graphql"
"github.com/99designs/gqlgen/graphql/handler"
Expand All @@ -13,7 +12,6 @@ import (
"github.com/ravilushqa/otelgqlgen"
"github.com/reearth/reearth-backend/internal/adapter/gql"
"github.com/reearth/reearth-backend/internal/usecase/interfaces"
"github.com/reearth/reearth-backend/pkg/rerror"
"github.com/vektah/gqlparser/v2/gqlerror"
)

Expand Down Expand Up @@ -82,13 +80,6 @@ func graphqlAPI(
// show more detailed error messgage in debug mode
func(ctx context.Context, e error) *gqlerror.Error {
if conf.Debug {
var ierr *rerror.ErrInternal
if errors.As(e, &ierr) {
if err2 := ierr.Unwrap(); err2 != nil {
// TODO: display stacktrace with xerrors
ec.Logger.Errorf("%+v", err2)
}
}
return gqlerror.ErrorPathf(graphql.GetFieldContext(ctx).Path(), e.Error())
}
return graphql.DefaultErrorPresenter(ctx, e)
Expand Down
29 changes: 21 additions & 8 deletions internal/infrastructure/memory/config.go
Expand Up @@ -9,25 +9,38 @@ import (
)

type Config struct {
lock sync.Mutex
data *config.Config
lock sync.Mutex
locked bool
data *config.Config
}

func NewConfig() repo.Config {
return &Config{}
}

func (r *Config) Load(ctx context.Context) (*config.Config, error) {
func (r *Config) LockAndLoad(ctx context.Context) (*config.Config, error) {
r.lock.Lock()
defer r.lock.Unlock()

r.locked = true
return r.data, nil
}

func (r *Config) Save(ctx context.Context, c *config.Config) error {
r.lock.Lock()
defer r.lock.Unlock()
if c != nil {
r.data = c
}
return nil
}

func (r *Config) SaveAndUnlock(ctx context.Context, c *config.Config) error {
_ = r.Save(ctx, c)
return r.Unlock(ctx)
}

r.data = c
func (r *Config) Unlock(_ context.Context) error {
if !r.locked {
return nil
}
r.lock.Unlock()
r.locked = false
return nil
}
14 changes: 14 additions & 0 deletions internal/infrastructure/memory/config_test.go
@@ -0,0 +1,14 @@
package memory

import (
"context"
"testing"

"github.com/stretchr/testify/assert"
)

func TestConfig(t *testing.T) {
ctx := context.Background()
c := NewConfig()
assert.NoError(t, c.Unlock(ctx))
}
1 change: 1 addition & 0 deletions internal/infrastructure/memory/container.go
Expand Up @@ -24,5 +24,6 @@ func InitRepos(c *repo.Container) *repo.Container {
c.User = NewUser()
c.SceneLock = NewSceneLock()
c.Transaction = NewTransaction()
c.Lock = NewLock()
return c
}
21 changes: 21 additions & 0 deletions internal/infrastructure/memory/lock.go
@@ -0,0 +1,21 @@
package memory

import (
"context"

"github.com/reearth/reearth-backend/internal/usecase/repo"
)

type Lock struct{}

func NewLock() repo.Lock {
return &Lock{}
}

func (r *Lock) Lock(_ context.Context, _ string) error {
return nil
}

func (r *Lock) Unlock(_ context.Context, _ string) error {
return nil
}
55 changes: 39 additions & 16 deletions internal/infrastructure/mongo/config.go
Expand Up @@ -8,39 +8,62 @@ import (
"github.com/reearth/reearth-backend/internal/usecase/repo"
"github.com/reearth/reearth-backend/pkg/config"
"github.com/reearth/reearth-backend/pkg/rerror"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

var upsert = true
const configLockName = "config"

type configRepo struct {
client *mongodoc.ClientCollection
lock repo.Lock
}

func NewConfig(client *mongodoc.Client) repo.Config {
return &configRepo{client: client.WithCollection("config")}
func NewConfig(client *mongodoc.Client, lock repo.Lock) repo.Config {
return &configRepo{client: client.WithCollection("config"), lock: lock}
}

func (r *configRepo) Load(ctx context.Context) (*config.Config, error) {
cfg := &config.Config{}
if err := r.client.Collection().FindOne(ctx, nil).Decode(cfg); err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return cfg, nil
func (r *configRepo) LockAndLoad(ctx context.Context) (cfg *config.Config, err error) {
if err := r.lock.Lock(ctx, configLockName); err != nil {
return nil, err
}

cfgd := &mongodoc.ConfigDocument{}
if err := r.client.Collection().FindOne(ctx, bson.M{}).Decode(cfgd); err != nil {
if !errors.Is(err, mongo.ErrNilDocument) && !errors.Is(err, mongo.ErrNoDocuments) {
return nil, rerror.ErrInternalBy(err)
}
return nil, rerror.ErrInternalBy(err)
}
return cfg, nil
return cfgd.Model(), nil
}

func (r *configRepo) Save(ctx context.Context, cfg *config.Config) error {
if cfg == nil {
return nil
if cfg != nil {
if _, err := r.client.Collection().UpdateOne(
ctx,
bson.M{},
bson.M{"$set": mongodoc.NewConfig(*cfg)},
(&options.UpdateOptions{}).SetUpsert(true),
); err != nil {
return rerror.ErrInternalBy(err)
}
}
if _, err := r.client.Collection().UpdateOne(ctx, nil, cfg, &options.UpdateOptions{
Upsert: &upsert,
}); err != nil {
return rerror.ErrInternalBy(err)

return nil
}

func (r *configRepo) SaveAndUnlock(ctx context.Context, cfg *config.Config) error {
if err := r.Save(ctx, cfg); err != nil {
return err
}
return r.Unlock(ctx)
}

func (r *configRepo) Unlock(ctx context.Context) error {
if err := r.lock.Unlock(ctx, configLockName); err != nil && !errors.Is(err, repo.ErrNotLocked) {
return err
}

return nil
}
13 changes: 10 additions & 3 deletions internal/infrastructure/mongo/container.go
Expand Up @@ -13,10 +13,15 @@ func InitRepos(ctx context.Context, c *repo.Container, mc *mongo.Client, databas
if databaseName == "" {
databaseName = "reearth"
}
client := mongodoc.NewClient(databaseName, mc)

lock, err := NewLock(mc.Database(databaseName).Collection("locks"))
if err != nil {
return err
}

client := mongodoc.NewClient(databaseName, mc)
c.Asset = NewAsset(client)
c.Config = NewConfig(client)
c.Config = NewConfig(client, lock)
c.DatasetSchema = NewDatasetSchema(client)
c.Dataset = NewDataset(client)
c.Layer = NewLayer(client)
Expand All @@ -30,8 +35,10 @@ func InitRepos(ctx context.Context, c *repo.Container, mc *mongo.Client, databas
c.User = NewUser(client)
c.SceneLock = NewSceneLock(client)
c.Transaction = NewTransaction(client)
c.Lock = lock

if err := (migration.Client{Client: client}).Migrate(ctx); err != nil {
// migration
if err := (migration.Client{Client: client, Config: c.Config}).Migrate(ctx); err != nil {
return err
}

Expand Down

0 comments on commit db4ceaf

Please sign in to comment.