Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
b59be1a9d7
|
|||
|
d116f5d938
|
|||
|
2b4f13f807
|
|||
|
119243297e
|
62
dbinterface.go
Normal file
62
dbinterface.go
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
package mgoapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gitbase.de/gopackage/mgocrud/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{}
|
||||||
|
|
||||||
|
type Pipe interface {
|
||||||
|
All(result interface{}) error
|
||||||
|
}
|
||||||
@@ -162,7 +162,7 @@ func _validateFilter(structT reflect.Type, f bson.M, checkValues bool) (bson.M,
|
|||||||
valT := reflect.TypeOf(val)
|
valT := reflect.TypeOf(val)
|
||||||
if valT.Kind() == reflect.Slice {
|
if valT.Kind() == reflect.Slice {
|
||||||
l := len(val.([]interface{}))
|
l := len(val.([]interface{}))
|
||||||
newVal = make([]interface{}, l, l)
|
newVal = make([]interface{}, l)
|
||||||
for i := 0; i < l; i++ {
|
for i := 0; i < l; i++ {
|
||||||
var err error
|
var err error
|
||||||
switch valF := val.([]interface{})[i].(type) {
|
switch valF := val.([]interface{})[i].(type) {
|
||||||
|
|||||||
4
go.mod
4
go.mod
@@ -1,9 +1,9 @@
|
|||||||
module gitbase.de/gopackage/mgoapi
|
module gitbase.de/gopackage/mgoapi/v2
|
||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require (
|
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/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/gin-gonic/gin v1.6.3
|
github.com/gin-gonic/gin v1.6.3
|
||||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -1,5 +1,5 @@
|
|||||||
gitbase.de/gopackage/mgocrud v0.0.0-20210301125326-161e3b46fb99 h1:2PovCTzQpTTmgxKdO915G+JmQPFYY6NKRZMKxw9jSYE=
|
gitbase.de/gopackage/mgocrud/v2 v2.0.5 h1:sgRJXw0ZvNDtsjmIhNDoe/8pO0Bed313aXFX6SlW6fQ=
|
||||||
gitbase.de/gopackage/mgocrud v0.0.0-20210301125326-161e3b46fb99/go.mod h1:obb5Piqrb7N1VnmPp8HHJsAcOqIn9l04ibvH6I2qkhg=
|
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.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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
|||||||
21
handler.go
21
handler.go
@@ -7,9 +7,8 @@ import (
|
|||||||
|
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
|
||||||
"gitbase.de/gopackage/mgocrud"
|
"gitbase.de/gopackage/mgocrud/v2"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
mgo "gopkg.in/mgo.v2"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
"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)
|
newM, err := getDocument(c, db, m, validSelect)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status := 500
|
status := 500
|
||||||
if err == mgo.ErrNotFound {
|
if err == mgocrud.ErrNotFound {
|
||||||
status = 404
|
status = 404
|
||||||
}
|
}
|
||||||
c.JSON(status, errorObject(err))
|
c.JSON(status, errorObject(err))
|
||||||
@@ -144,7 +143,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
|
|||||||
|
|
||||||
queryCount := c.Query("count")
|
queryCount := c.Query("count")
|
||||||
if queryCount == "1" || strings.ToLower(queryCount) == "true" {
|
if queryCount == "1" || strings.ToLower(queryCount) == "true" {
|
||||||
count, err := mgocrud.ReadCollectionCount(db, m, validFilter)
|
count, err := db.ReadCollectionCount(m, validFilter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
return
|
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 {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
return
|
return
|
||||||
@@ -219,7 +218,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err := mgocrud.CreateDocument(db, newM)
|
err := db.CreateDocument(newM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
return
|
return
|
||||||
@@ -227,7 +226,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
|
|||||||
|
|
||||||
readM := newModelOf(newM).(mgocrud.ModelInterface)
|
readM := newModelOf(newM).(mgocrud.ModelInterface)
|
||||||
readM.SetID(newM.GetID())
|
readM.SetID(newM.GetID())
|
||||||
err = mgocrud.ReadDocument(db, readM, nil)
|
err = db.ReadDocument(readM, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
return
|
return
|
||||||
@@ -265,7 +264,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
|
|||||||
orgM, err := getDocument(c, db, m, nil)
|
orgM, err := getDocument(c, db, m, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status := 500
|
status := 500
|
||||||
if err == mgo.ErrNotFound {
|
if err == mgocrud.ErrNotFound {
|
||||||
status = 404
|
status = 404
|
||||||
}
|
}
|
||||||
c.JSON(status, errorObject(err))
|
c.JSON(status, errorObject(err))
|
||||||
@@ -359,7 +358,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mgocrud.UpdateDocument(db, orgM, changes)
|
err = db.UpdateDocument(orgM, changes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
return
|
return
|
||||||
@@ -407,14 +406,14 @@ func (api *API) collectionDeleteHandler(m mgocrud.ModelInterface) gin.HandlerFun
|
|||||||
orgM, err := getDocument(c, db, m, bson.M{"_id": 1})
|
orgM, err := getDocument(c, db, m, bson.M{"_id": 1})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status := 500
|
status := 500
|
||||||
if err == mgo.ErrNotFound {
|
if err == mgocrud.ErrNotFound {
|
||||||
status = 404
|
status = 404
|
||||||
}
|
}
|
||||||
c.JSON(status, errorObject(err))
|
c.JSON(status, errorObject(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mgocrud.DeleteDocument(db, orgM)
|
err = db.DeleteDocument(orgM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(500, errorObject(err))
|
c.JSON(500, errorObject(err))
|
||||||
}
|
}
|
||||||
|
|||||||
15
helper.go
15
helper.go
@@ -6,9 +6,8 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitbase.de/gopackage/mgocrud"
|
"gitbase.de/gopackage/mgocrud/v2"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
mgo "gopkg.in/mgo.v2"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ func string2ObjectID(id string) (objectID *bson.ObjectId, err error) {
|
|||||||
case error:
|
case error:
|
||||||
err = x
|
err = x
|
||||||
default:
|
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 {
|
if f.Anonymous {
|
||||||
// embed directly
|
// embed directly
|
||||||
embed := getStructMeta(_type, dontRecurse)
|
embed := getStructMeta(_type, dontRecurse)
|
||||||
for _, e := range embed {
|
meta = append(meta, embed...)
|
||||||
meta = append(meta, e)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
fMeta := make(map[string]interface{})
|
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 = _type.String()
|
||||||
}
|
}
|
||||||
//fType = strings.Replace(fType, "*", "", -1)
|
//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
|
fMeta["type"] = fType
|
||||||
kind = _type.Kind()
|
kind = _type.Kind()
|
||||||
fMeta["kind"] = kind.String()
|
fMeta["kind"] = kind.String()
|
||||||
@@ -157,14 +154,14 @@ func getModelMeta(m mgocrud.ModelInterface) []map[string]interface{} {
|
|||||||
return getStructMeta(modelType, dontRecurse)
|
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"))
|
objectID, err := string2ObjectID(c.Param("id"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
newM := newModelOf(m).(mgocrud.ModelInterface)
|
newM := newModelOf(m).(mgocrud.ModelInterface)
|
||||||
newM.SetID(objectID)
|
newM.SetID(objectID)
|
||||||
err = mgocrud.ReadDocument(db, newM, selector)
|
err = db.ReadDocument(newM, selector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
4
hooks.go
4
hooks.go
@@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"gitbase.de/gopackage/mgocrud"
|
"gitbase.de/gopackage/mgocrud/v2"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"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 {
|
func savedObject(c *Context, m mgocrud.ModelInterface, changes bson.M) error {
|
||||||
|
|||||||
3
login.go
3
login.go
@@ -8,12 +8,11 @@ import (
|
|||||||
jwt "github.com/dgrijalva/jwt-go"
|
jwt "github.com/dgrijalva/jwt-go"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
mgo "gopkg.in/mgo.v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// LoginModel is interface for modules which can be used for the login route
|
// LoginModel is interface for modules which can be used for the login route
|
||||||
type LoginModel interface {
|
type LoginModel interface {
|
||||||
LoginCheck(db *mgo.Database) (tokenData interface{}, err error)
|
LoginCheck(db Database) (tokenData interface{}, err error)
|
||||||
LoginResponse(token string) (interface{}, error)
|
LoginResponse(token string) (interface{}, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
register.go
13
register.go
@@ -1,14 +1,13 @@
|
|||||||
package mgoapi
|
package mgoapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitbase.de/gopackage/mgocrud"
|
"gitbase.de/gopackage/mgocrud/v2"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
mgo "gopkg.in/mgo.v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// API is wrapper for one RouterGroup and mgo DB
|
// API is wrapper for one RouterGroup and mgo DB
|
||||||
type API struct {
|
type API struct {
|
||||||
DBSession *mgo.Session
|
DBSession Session
|
||||||
DBName string
|
DBName string
|
||||||
routerGroup *gin.RouterGroup
|
routerGroup *gin.RouterGroup
|
||||||
jwtSecret []byte
|
jwtSecret []byte
|
||||||
@@ -19,11 +18,11 @@ type API struct {
|
|||||||
type Context struct {
|
type Context struct {
|
||||||
*gin.Context
|
*gin.Context
|
||||||
API *API
|
API *API
|
||||||
DB *mgo.Database
|
DB Database
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns new instance of the API
|
// 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{
|
return &API{
|
||||||
DBSession: session,
|
DBSession: session,
|
||||||
DBName: dbname,
|
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
|
// RegisterModel setups gin routes for model GET, POST, PUT and DELETE
|
||||||
func (api *API) RegisterModel(m mgocrud.ModelInterface) {
|
func (api *API) RegisterModel(m mgocrud.ModelInterface) {
|
||||||
@@ -42,7 +41,7 @@ func (api *API) RegisterModel(m mgocrud.ModelInterface) {
|
|||||||
defer session.Close()
|
defer session.Close()
|
||||||
db := session.DB(api.DBName)
|
db := session.DB(api.DBName)
|
||||||
|
|
||||||
err := mgocrud.EnsureIndex(db, m)
|
err := db.EnsureIndex(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user