3 Commits

Author SHA1 Message Date
d116f5d938 db interface 2022-02-09 20:21:08 +01:00
2b4f13f807 mgocrud v2.0.4 2022-02-09 18:57:26 +01:00
119243297e using mgocrud interfaces instead of mgo 2022-02-09 15:55:43 +01:00
9 changed files with 95 additions and 36 deletions

65
dbinterface.go Normal file
View File

@@ -0,0 +1,65 @@
package mgoapi
import (
"gitbase.de/gopackage/mgocrud/v2"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type Session interface {
Close()
Copy() Session
DB(name string) Database
}
type Database interface {
Session() Session
C(name string) Collection
Name() string
EnsureIndex(m mgocrud.ModelInterface) error
ValidateObject(m mgocrud.ModelInterface, changes bson.M) error
ReadDocument(m mgocrud.ModelInterface, selector bson.M) error
CreateDocument(m mgocrud.ModelInterface) error
ReadCollection(results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier mgocrud.PipelineModifierFunction) error
ReadCollectionCount(m mgocrud.ModelInterface, filter bson.M) (count int, err error)
UpdateDocument(m mgocrud.ModelInterface, changes bson.M) error
UpsertDocument(m mgocrud.ModelInterface, changes bson.M) error
DeleteDocument(m mgocrud.ModelInterface) error
DeleteDocuments(m mgocrud.ModelInterface, filter bson.M) (removed int, err error)
}
type Collection interface {
Insert(docs ...interface{}) error
UpdateId(id interface{}, update interface{}) error
RemoveId(id interface{}) error
Upsert(selector interface{}, update interface{}) (ChangeInfo, error)
RemoveAll(filter interface{}) (ChangeInfo, error)
FindId(id interface{}) Query
Find(query interface{}) Query
EnsureIndex(index Index) error
Pipe(pipeline interface{}) Pipe
}
type ChangeInfo interface {
Matched() int
Removed() int
Updated() int
}
type Query interface {
Select(selector interface{}) Query
One(result interface{}) error
Sort(fields ...string) Query
Skip(n int) Query
Limit(n int) Query
All(result interface{}) error
Count() (int, error)
}
type Index interface {
NewMgoIndex(index mgo.Index) Index
}
type Pipe interface {
All(result interface{}) error
}

View File

@@ -162,7 +162,7 @@ func _validateFilter(structT reflect.Type, f bson.M, checkValues bool) (bson.M,
valT := reflect.TypeOf(val)
if valT.Kind() == reflect.Slice {
l := len(val.([]interface{}))
newVal = make([]interface{}, l, l)
newVal = make([]interface{}, l)
for i := 0; i < l; i++ {
var err error
switch valF := val.([]interface{})[i].(type) {

4
go.mod
View File

@@ -1,9 +1,9 @@
module gitbase.de/gopackage/mgoapi
module gitbase.de/gopackage/mgoapi/v2
go 1.16
require (
gitbase.de/gopackage/mgocrud v0.0.0-20210301125326-161e3b46fb99
gitbase.de/gopackage/mgocrud/v2 v2.0.5
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-gonic/gin v1.6.3
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22

4
go.sum
View File

@@ -1,5 +1,5 @@
gitbase.de/gopackage/mgocrud v0.0.0-20210301125326-161e3b46fb99 h1:2PovCTzQpTTmgxKdO915G+JmQPFYY6NKRZMKxw9jSYE=
gitbase.de/gopackage/mgocrud v0.0.0-20210301125326-161e3b46fb99/go.mod h1:obb5Piqrb7N1VnmPp8HHJsAcOqIn9l04ibvH6I2qkhg=
gitbase.de/gopackage/mgocrud/v2 v2.0.5 h1:sgRJXw0ZvNDtsjmIhNDoe/8pO0Bed313aXFX6SlW6fQ=
gitbase.de/gopackage/mgocrud/v2 v2.0.5/go.mod h1:eAIqxjo60/nP/S+YA25SBLQZ98WUrHwpvjE7Zl+ewTM=
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=

View File

@@ -7,9 +7,8 @@ import (
"runtime/debug"
"gitbase.de/gopackage/mgocrud"
"gitbase.de/gopackage/mgocrud/v2"
"github.com/gin-gonic/gin"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
@@ -42,7 +41,7 @@ func (api *API) collectionGetOneHandler(m mgocrud.ModelInterface) gin.HandlerFun
newM, err := getDocument(c, db, m, validSelect)
if err != nil {
status := 500
if err == mgo.ErrNotFound {
if err == mgocrud.ErrNotFound {
status = 404
}
c.JSON(status, errorObject(err))
@@ -144,7 +143,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
queryCount := c.Query("count")
if queryCount == "1" || strings.ToLower(queryCount) == "true" {
count, err := mgocrud.ReadCollectionCount(db, m, validFilter)
count, err := db.ReadCollectionCount(m, validFilter)
if err != nil {
c.JSON(500, errorObject(err))
return
@@ -170,7 +169,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
}
}
err = mgocrud.ReadCollection(db, results, validFilter, validSelect, offset, limit, clearedSort, pipelineModFunc)
err = db.ReadCollection(results, validFilter, validSelect, offset, limit, clearedSort, pipelineModFunc)
if err != nil {
c.JSON(500, errorObject(err))
return
@@ -219,7 +218,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
return
}
err := mgocrud.CreateDocument(db, newM)
err := db.CreateDocument(newM)
if err != nil {
c.JSON(500, errorObject(err))
return
@@ -227,7 +226,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
readM := newModelOf(newM).(mgocrud.ModelInterface)
readM.SetID(newM.GetID())
err = mgocrud.ReadDocument(db, readM, nil)
err = db.ReadDocument(readM, nil)
if err != nil {
c.JSON(500, errorObject(err))
return
@@ -265,7 +264,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
orgM, err := getDocument(c, db, m, nil)
if err != nil {
status := 500
if err == mgo.ErrNotFound {
if err == mgocrud.ErrNotFound {
status = 404
}
c.JSON(status, errorObject(err))
@@ -359,7 +358,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
return
}
err = mgocrud.UpdateDocument(db, orgM, changes)
err = db.UpdateDocument(orgM, changes)
if err != nil {
c.JSON(500, errorObject(err))
return
@@ -407,14 +406,14 @@ func (api *API) collectionDeleteHandler(m mgocrud.ModelInterface) gin.HandlerFun
orgM, err := getDocument(c, db, m, bson.M{"_id": 1})
if err != nil {
status := 500
if err == mgo.ErrNotFound {
if err == mgocrud.ErrNotFound {
status = 404
}
c.JSON(status, errorObject(err))
return
}
err = mgocrud.DeleteDocument(db, orgM)
err = db.DeleteDocument(orgM)
if err != nil {
c.JSON(500, errorObject(err))
}

View File

@@ -6,9 +6,8 @@ import (
"regexp"
"strings"
"gitbase.de/gopackage/mgocrud"
"gitbase.de/gopackage/mgocrud/v2"
"github.com/gin-gonic/gin"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
@@ -41,7 +40,7 @@ func string2ObjectID(id string) (objectID *bson.ObjectId, err error) {
case error:
err = x
default:
err = errors.New("Unknown panic in: string2ObjectID")
err = errors.New("unknown panic in: string2ObjectID")
}
}
}()
@@ -72,9 +71,7 @@ func getStructMeta(s reflect.Type, dontRecurse map[string]bool) []map[string]int
if f.Anonymous {
// embed directly
embed := getStructMeta(_type, dontRecurse)
for _, e := range embed {
meta = append(meta, e)
}
meta = append(meta, embed...)
} else {
fMeta := make(map[string]interface{})
@@ -89,7 +86,7 @@ func getStructMeta(s reflect.Type, dontRecurse map[string]bool) []map[string]int
fType = _type.String()
}
//fType = strings.Replace(fType, "*", "", -1)
fType = regexp.MustCompile("\\*[a-zA-Z0-9]*\\.?").ReplaceAllString(fType, "")
fType = regexp.MustCompile(`\*[a-zA-Z0-9]*\.?`).ReplaceAllString(fType, "")
fMeta["type"] = fType
kind = _type.Kind()
fMeta["kind"] = kind.String()
@@ -157,14 +154,14 @@ func getModelMeta(m mgocrud.ModelInterface) []map[string]interface{} {
return getStructMeta(modelType, dontRecurse)
}
func getDocument(c *gin.Context, db *mgo.Database, m mgocrud.ModelInterface, selector bson.M) (mgocrud.ModelInterface, error) {
func getDocument(c *gin.Context, db Database, m mgocrud.ModelInterface, selector bson.M) (mgocrud.ModelInterface, error) {
objectID, err := string2ObjectID(c.Param("id"))
if err != nil {
return nil, err
}
newM := newModelOf(m).(mgocrud.ModelInterface)
newM.SetID(objectID)
err = mgocrud.ReadDocument(db, newM, selector)
err = db.ReadDocument(newM, selector)
if err != nil {
return nil, err
}

View File

@@ -4,7 +4,7 @@ import (
"fmt"
"reflect"
"gitbase.de/gopackage/mgocrud"
"gitbase.de/gopackage/mgocrud/v2"
"gopkg.in/mgo.v2/bson"
)
@@ -71,7 +71,7 @@ func validateObject(c *Context, m mgocrud.ModelInterface, changes bson.M) error
}
}
return mgocrud.ValidateObject(c.DB, m, changes)
return c.DB.ValidateObject(m, changes)
}
func savedObject(c *Context, m mgocrud.ModelInterface, changes bson.M) error {

View File

@@ -8,12 +8,11 @@ import (
jwt "github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
mgo "gopkg.in/mgo.v2"
)
// LoginModel is interface for modules which can be used for the login route
type LoginModel interface {
LoginCheck(db *mgo.Database) (tokenData interface{}, err error)
LoginCheck(db Database) (tokenData interface{}, err error)
LoginResponse(token string) (interface{}, error)
}

View File

@@ -1,14 +1,13 @@
package mgoapi
import (
"gitbase.de/gopackage/mgocrud"
"gitbase.de/gopackage/mgocrud/v2"
"github.com/gin-gonic/gin"
mgo "gopkg.in/mgo.v2"
)
// API is wrapper for one RouterGroup and mgo DB
type API struct {
DBSession *mgo.Session
DBSession Session
DBName string
routerGroup *gin.RouterGroup
jwtSecret []byte
@@ -19,11 +18,11 @@ type API struct {
type Context struct {
*gin.Context
API *API
DB *mgo.Database
DB Database
}
// New returns new instance of the API
func New(session *mgo.Session, dbname string, routerGroup *gin.RouterGroup) *API {
func New(session Session, dbname string, routerGroup *gin.RouterGroup) *API {
return &API{
DBSession: session,
DBName: dbname,
@@ -31,7 +30,7 @@ func New(session *mgo.Session, dbname string, routerGroup *gin.RouterGroup) *API
}
}
var modelRegistry = make([]mgocrud.ModelInterface, 0, 0)
var modelRegistry = make([]mgocrud.ModelInterface, 0)
// RegisterModel setups gin routes for model GET, POST, PUT and DELETE
func (api *API) RegisterModel(m mgocrud.ModelInterface) {
@@ -42,7 +41,7 @@ func (api *API) RegisterModel(m mgocrud.ModelInterface) {
defer session.Close()
db := session.DB(api.DBName)
err := mgocrud.EnsureIndex(db, m)
err := db.EnsureIndex(m)
if err != nil {
panic(err)
}