Skip to content

Commit

Permalink
Merge pull request #12 from 0x-buidl/fix/find_many_results_with_nil_c…
Browse files Browse the repository at this point in the history
…ollections

fix: find many results comes with nil collection
  • Loading branch information
lxnre-codes committed Sep 3, 2023
2 parents 553e023 + 019bc14 commit dd280a5
Show file tree
Hide file tree
Showing 11 changed files with 228 additions and 167 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[![Go MongoDB](https://img.shields.io/badge/mongodb-driver-g?logo=mongodb)](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo)
[![Go Report Card](https://goreportcard.com/badge/github.com/0x-buidl/mgs)](https://goreportcard.com/report/github.com/0x-buidl/mgs)
[![Go Reference](https://pkg.go.dev/badge/github.com/0x-buidl/mgs.svg)](https://pkg.go.dev/github.com/0x-buidl/mgs)
[![Coverage Status](https://coveralls.io/repos/github/0x-buidl/mgs/badge.svg)](https://coveralls.io/github/0x-buidl/mgs)
[![Coverage Status](https://coveralls.io/repos/github/0x-buidl/mgs/badge.svg?branch=main)](https://coveralls.io/github/0x-buidl/mgs)

Mgs is a mongoose-like [go mongodb](https://github.com/mongodb/mongo-go-driver) odm. If you've used [mongoose.js](https://mongoosejs.com), or you're looking for a dev friendly [mongodb](https://www.mongodb.com) odm for golang, then this is for you.

Expand Down
32 changes: 4 additions & 28 deletions document.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,24 +194,12 @@ func (doc *Document[T, P]) Model() *Model[T, P] {
// Returns doc as JSON bytes.
func (doc *Document[T, P]) MarshalJSON() ([]byte, error) {
d := make(map[string]any)
bts, err := json.Marshal(doc.Doc)
if err != nil {
return nil, err
}

err = json.Unmarshal(bts, &d)
if err != nil {
if err := internal.DecodeJSON(doc.Doc, &d); err != nil {
return nil, err
}

defDoc := make(map[string]any)
bts, err = json.Marshal(doc.IDefaultSchema)
if err != nil {
return nil, err
}

err = json.Unmarshal(bts, &defDoc)
if err != nil {
if err := internal.DecodeJSON(doc.IDefaultSchema, &defDoc); err != nil {
return nil, err
}

Expand Down Expand Up @@ -240,25 +228,13 @@ func (doc *Document[T, P]) JSON() (map[string]any, error) {

// Returns doc as BSON bytes.
func (doc *Document[T, P]) MarshalBSON() ([]byte, error) {
bts, err := bson.Marshal(doc.Doc)
if err != nil {
return nil, err
}

var d bson.M
err = bson.Unmarshal(bts, &d)
if err != nil {
if err := internal.DecodeBSON(doc.Doc, &d); err != nil {
return nil, err
}

defDoc := bson.M{}
bts, err = bson.Marshal(doc.IDefaultSchema)
if err != nil {
return nil, err
}

err = bson.Unmarshal(bts, &defDoc)
if err != nil {
if err := internal.DecodeBSON(doc.IDefaultSchema, &defDoc); err != nil {
return nil, err
}

Expand Down
26 changes: 26 additions & 0 deletions document_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,29 @@ func TestSaveDocument(t *testing.T) {
assert.Equal(t, "The Lord of the Rings: The Fellowship of the Ring", doc.Doc.Title)
})
}

func TestMarshalDocument(t *testing.T) {
t.Run("Should return error when marshaling document", func(t *testing.T) {
doc := mgs.Document[TestDefaultSchema, *TestDefaultSchema]{
Doc: &TestDefaultSchema{"foo": make(chan int)},
}

_, err := doc.MarshalJSON()
assert.Error(t, err)
assert.Contains(t, err.Error(), "json: unsupported type: chan int")

_, err = doc.MarshalBSON()
assert.Error(t, err)
assert.Contains(t, err.Error(), "no encoder found for chan int")

doc.Doc = &TestDefaultSchema{"foo": "bar"}
doc.IDefaultSchema = &TestDefaultSchema{"foo": make(chan string)}
_, err = doc.MarshalJSON()
assert.Error(t, err)
assert.Contains(t, err.Error(), "json: unsupported type: chan string")

_, err = doc.MarshalBSON()
assert.Error(t, err)
assert.Contains(t, err.Error(), "no encoder found for chan string")
})
}
28 changes: 28 additions & 0 deletions examples/database/author.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package database

import (
"context"
"time"

"github.com/0x-buidl/mgs"
"go.mongodb.org/mongo-driver/mongo"
)

type Author struct {
Name string `json:"name" bson:"name"`
Deleted bool `json:"-" bson:"deleted"`
DeletedAt *time.Time `json:"-" bson:"deletedAt"`
}

type (
AuthorModel = mgs.Model[Author, *mgs.DefaultSchema]
AuthorDoc = mgs.Document[Author, *mgs.DefaultSchema]
)

func NewAuthorModel(coll *mongo.Collection) *AuthorModel {
return mgs.NewModel[Author, *mgs.DefaultSchema](coll)
}

func (a Author) Validate(ctx context.Context, arg *mgs.HookArg[Author]) error {
return nil
}
27 changes: 18 additions & 9 deletions examples/database/book.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@ package database

import (
"context"
"fmt"
"time"

"github.com/0x-buidl/mgs"
"github.com/go-playground/validator/v10"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)

type Book struct {
Title string `json:"title" bson:"title"`
Author primitive.ObjectID `json:"author" bson:"author"`
Price float64 `json:"price" bson:"price"`
Deleted bool `json:"-" bson:"deleted"`
DeletedAt *time.Time `json:"-" bson:"deletedAt"`
Title string `json:"title" bson:"title"`
// ObjectID or Author Object
Author interface{} `json:"author" bson:"author"`
Reviews []interface{} `json:"chapters" bson:"chapters"`
Deleted bool `json:"-" bson:"deleted"`
DeletedAt *time.Time `json:"-" bson:"deletedAt"`
}

type (
Expand All @@ -27,9 +28,15 @@ func NewBookModel(coll *mongo.Collection) *BookModel {
return mgs.NewModel[Book, *mgs.DefaultSchema](coll)
}

func (book Book) Validate(ctx context.Context, arg *mgs.HookArg[Book]) error {
v := validator.New()
return v.StructCtx(ctx, book)
func (b Book) Validate(ctx context.Context, arg *mgs.HookArg[Book]) error {
var err error

doc := arg.Data().(*BookDoc)
if _, ok := doc.Doc.Author.(primitive.ObjectID); !ok {
err = fmt.Errorf("author must be ObjectID")
}

return err
}

func (book Book) BeforeValidate(ctx context.Context, arg *mgs.HookArg[Book]) error {
Expand Down Expand Up @@ -65,6 +72,8 @@ func (book Book) AfterDelete(ctx context.Context, arg *mgs.HookArg[Book]) error
}

func (book Book) BeforeFind(ctx context.Context, arg *mgs.HookArg[Book]) error {
q := arg.Data().(*mgs.Query[Book]).Filter
q["deleted"] = false
return nil
}

Expand Down
28 changes: 28 additions & 0 deletions examples/database/review.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package database

import (
"context"

"github.com/0x-buidl/mgs"
"go.mongodb.org/mongo-driver/mongo"
)

type Review struct {
// ObjectID or Book object
Book interface{} `bson:"book" json:"book" validate:"required"`
Comment string `bson:"comment" json:"comment" validate:"required"`
Rating int `bson:"rating" json:"rating" validate:"required"`
}

type (
ReviewModel = mgs.Model[Review, *mgs.DefaultSchema]
ReviewDoc = mgs.Document[Review, *mgs.DefaultSchema]
)

func NewReviewModel(coll *mongo.Collection) *ReviewModel {
return mgs.NewModel[Review, *mgs.DefaultSchema](coll)
}

func (r Review) Validate(ctx context.Context, arg *mgs.HookArg[Review]) error {
return nil
}
7 changes: 0 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,14 @@ module github.com/0x-buidl/mgs
go 1.20

require (
github.com/go-playground/validator/v10 v10.15.3
github.com/stretchr/testify v1.8.4
go.mongodb.org/mongo-driver v1.12.1
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
Expand All @@ -24,9 +19,7 @@ require (
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
golang.org/x/crypto v0.7.0 // indirect
golang.org/x/net v0.8.0 // indirect
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/text v0.8.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
16 changes: 0 additions & 16 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.15.3 h1:S+sSpunYjNPDuXkWbK+x+bA7iXiW296KG4dL3X7xUZo=
github.com/go-playground/validator/v10 v10.15.3/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand All @@ -28,7 +17,6 @@ github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
Expand All @@ -52,8 +40,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand All @@ -63,8 +49,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
29 changes: 29 additions & 0 deletions internal/utils.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package internal

import (
"encoding/json"
"reflect"
"strings"

"go.mongodb.org/mongo-driver/bson"
)

func IsModified(old, newV interface{}, field string) bool {
Expand All @@ -27,3 +30,29 @@ func IsModified(old, newV interface{}, field string) bool {
return IsModified(of.Interface(), nf.Interface(), strings.Join(parts[1:], "."))
}
}

func DecodeJSON(d, v interface{}) error {
bts, err := json.Marshal(d)
if err != nil {
return err
}

err = json.Unmarshal(bts, v)
if err != nil {
return err
}
return nil
}

func DecodeBSON(d, v interface{}) error {
bts, err := bson.Marshal(d)
if err != nil {
return err
}

err = bson.Unmarshal(bts, v)
if err != nil {
return err
}
return nil
}
Loading

0 comments on commit dd280a5

Please sign in to comment.