feat: Replace mongo package with monc & mon (#2002)
* Replace mongo package with monc & mon * Add terminal whitespace * format codemaster
parent
ed1c937998
commit
c27e00b45c
@ -0,0 +1,41 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTemplate(t *testing.T) {
|
||||||
|
tempDir := t.TempDir()
|
||||||
|
pathx.RegisterGoctlHome(tempDir)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
pathx.RegisterGoctlHome("")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Category", func(t *testing.T) {
|
||||||
|
assert.Equal(t, category, Category())
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Clean", func(t *testing.T) {
|
||||||
|
err := Clean()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Templates", func(t *testing.T) {
|
||||||
|
err := Templates()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, pathx.FileExists(filepath.Join(tempDir, category, modelTemplateFile)))
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("RevertTemplate", func(t *testing.T) {
|
||||||
|
assert.NoError(t, RevertTemplate(modelTemplateFile))
|
||||||
|
assert.Error(t, RevertTemplate("foo"))
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Update", func(t *testing.T) {
|
||||||
|
assert.NoError(t, Update())
|
||||||
|
})
|
||||||
|
}
|
@ -1,6 +1,12 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "errors"
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
var ErrNotFound = errors.New("not found")
|
"github.com/zeromicro/go-zero/core/stores/mon"
|
||||||
var ErrInvalidObjectId = errors.New("invalid objectId")
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrNotFound = mon.ErrNotFound
|
||||||
|
ErrInvalidObjectId = errors.New("invalid objectId")
|
||||||
|
)
|
||||||
|
@ -1,98 +1,77 @@
|
|||||||
|
// Code generated by goctl. DO NOT EDIT!
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/globalsign/mgo/bson"
|
{{if .Cache}}"github.com/zeromicro/go-zero/core/stores/monc"{{else}}"github.com/zeromicro/go-zero/core/stores/mon"{{end}}
|
||||||
{{if .Cache}}cachec "github.com/zeromicro/go-zero/core/stores/cache"
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
"github.com/zeromicro/go-zero/core/stores/mongoc"{{else}}"github.com/zeromicro/go-zero/core/stores/mongo"{{end}}
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
)
|
)
|
||||||
|
|
||||||
{{if .Cache}}var prefix{{.Type}}CacheKey = "cache:{{.Type}}:"{{end}}
|
{{if .Cache}}var prefix{{.Type}}CacheKey = "cache:{{.lowerType}}:"{{end}}
|
||||||
|
|
||||||
type {{.Type}}Model interface{
|
type {{.lowerType}}Model interface{
|
||||||
Insert(ctx context.Context,data *{{.Type}}) error
|
Insert(ctx context.Context,data *{{.Type}}) error
|
||||||
FindOne(ctx context.Context,id string) (*{{.Type}}, error)
|
FindOne(ctx context.Context,id string) (*{{.Type}}, error)
|
||||||
Update(ctx context.Context,data *{{.Type}}) error
|
Update(ctx context.Context,data *{{.Type}}) error
|
||||||
Delete(ctx context.Context,id string) error
|
Delete(ctx context.Context,id string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type default{{.Type}}Model struct {
|
type default{{.Type}}Model struct {
|
||||||
{{if .Cache}}*mongoc.Model{{else}}*mongo.Model{{end}}
|
conn {{if .Cache}}*monc.Model{{else}}*mon.Model{{end}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func New{{.Type}}Model(url, collection string{{if .Cache}}, c cachec.CacheConf{{end}}) {{.Type}}Model {
|
func newDefault{{.Type}}Model(conn {{if .Cache}}*monc.Model{{else}}*mon.Model{{end}}) *default{{.Type}}Model {
|
||||||
return &default{{.Type}}Model{
|
return &default{{.Type}}Model{conn: conn}
|
||||||
Model: {{if .Cache}}mongoc.MustNewModel(url, collection, c){{else}}mongo.MustNewModel(url, collection){{end}},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (m *default{{.Type}}Model) Insert(ctx context.Context, data *{{.Type}}) error {
|
func (m *default{{.Type}}Model) Insert(ctx context.Context, data *{{.Type}}) error {
|
||||||
if !data.ID.Valid() {
|
if !data.ID.IsZero() {
|
||||||
data.ID = bson.NewObjectId()
|
data.ID = primitive.NewObjectID()
|
||||||
|
data.CreateAt = time.Now()
|
||||||
|
data.UpdateAt = time.Now()
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := m.TakeSession()
|
{{if .Cache}}key := prefix{{.Type}}CacheKey + data.ID.Hex(){{end}}
|
||||||
if err != nil {
|
_, err := m.conn.InsertOne(ctx, {{if .Cache}}key, {{end}} data)
|
||||||
return err
|
return err
|
||||||
}
|
|
||||||
|
|
||||||
defer m.PutSession(session)
|
|
||||||
return m.GetCollection(session).Insert(data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *default{{.Type}}Model) FindOne(ctx context.Context, id string) (*{{.Type}}, error) {
|
func (m *default{{.Type}}Model) FindOne(ctx context.Context, id string) (*{{.Type}}, error) {
|
||||||
if !bson.IsObjectIdHex(id) {
|
oid, err := primitive.ObjectIDFromHex(id)
|
||||||
return nil, ErrInvalidObjectId
|
|
||||||
}
|
|
||||||
|
|
||||||
session, err := m.TakeSession()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, ErrInvalidObjectId
|
||||||
}
|
}
|
||||||
|
|
||||||
defer m.PutSession(session)
|
|
||||||
var data {{.Type}}
|
var data {{.Type}}
|
||||||
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
{{if .Cache}}key := prefix{{.Type}}CacheKey + data.ID.Hex(){{end}}
|
||||||
err = m.GetCollection(session).FindOneId(&data, key, bson.ObjectIdHex(id))
|
err = m.conn.FindOne(ctx, {{if .Cache}}key, {{end}}&data, bson.M{"_id": oid})
|
||||||
{{- else}}
|
|
||||||
err = m.GetCollection(session).FindId(bson.ObjectIdHex(id)).One(&data)
|
|
||||||
{{- end}}
|
|
||||||
switch err {
|
switch err {
|
||||||
case nil:
|
case nil:
|
||||||
return &data,nil
|
return &data, nil
|
||||||
case {{if .Cache}}mongoc.ErrNotFound{{else}}mongo.ErrNotFound{{end}}:
|
case {{if .Cache}}monc{{else}}mon{{end}}.ErrNotFound:
|
||||||
return nil,ErrNotFound
|
return nil, ErrNotFound
|
||||||
default:
|
default:
|
||||||
return nil,err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *default{{.Type}}Model) Update(ctx context.Context, data *{{.Type}}) error {
|
func (m *default{{.Type}}Model) Update(ctx context.Context, data *{{.Type}}) error {
|
||||||
session, err := m.TakeSession()
|
data.UpdateAt = time.Now()
|
||||||
if err != nil {
|
{{if .Cache}}key := prefix{{.Type}}CacheKey + data.ID.Hex(){{end}}
|
||||||
return err
|
_, err := m.conn.ReplaceOne(ctx, {{if .Cache}}key, {{end}}bson.M{"_id": data.ID}, data)
|
||||||
}
|
return err
|
||||||
|
|
||||||
defer m.PutSession(session)
|
|
||||||
{{if .Cache}}key := prefix{{.Type}}CacheKey + data.ID.Hex()
|
|
||||||
return m.GetCollection(session).UpdateId(data.ID, data, key)
|
|
||||||
{{- else}}
|
|
||||||
return m.GetCollection(session).UpdateId(data.ID, data)
|
|
||||||
{{- end}}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *default{{.Type}}Model) Delete(ctx context.Context, id string) error {
|
func (m *default{{.Type}}Model) Delete(ctx context.Context, id string) error {
|
||||||
session, err := m.TakeSession()
|
oid, err := primitive.ObjectIDFromHex(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return ErrInvalidObjectId
|
||||||
}
|
}
|
||||||
|
{{if .Cache}}key := prefix{{.Type}}CacheKey +id{{end}}
|
||||||
defer m.PutSession(session)
|
_, err = m.conn.DeleteOne(ctx, {{if .Cache}}key, {{end}}bson.M{"_id": oid})
|
||||||
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
return err
|
||||||
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id), key)
|
|
||||||
{{- else}}
|
|
||||||
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id))
|
|
||||||
{{- end}}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
{{if .Cache}}import (
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/cache"
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/monc"
|
||||||
|
){{else}}import "github.com/zeromicro/go-zero/core/stores/mon"{{end}}
|
||||||
|
|
||||||
|
var _ {{.Type}}Model = (*custom{{.Type}}Model)(nil)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// {{.Type}}Model is an interface to be customized, add more methods here,
|
||||||
|
// and implement the added methods in custom{{.Type}}Model.
|
||||||
|
{{.Type}}Model interface {
|
||||||
|
{{.lowerType}}Model
|
||||||
|
}
|
||||||
|
|
||||||
|
custom{{.Type}}Model struct {
|
||||||
|
*default{{.Type}}Model
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// New{{.Type}}Model returns a model for the mongo.
|
||||||
|
func New{{.Type}}Model(url, db, collection string{{if .Cache}}, c cache.CacheConf{{end}}) {{.Type}}Model {
|
||||||
|
conn := {{if .Cache}}monc{{else}}mon{{end}}.MustNewModel(url, db, collection{{if .Cache}}, c{{end}})
|
||||||
|
return &custom{{.Type}}Model{
|
||||||
|
default{{.Type}}Model: newDefault{{.Type}}Model(conn),
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
)
|
||||||
|
|
||||||
|
type {{.Type}} struct {
|
||||||
|
ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
|
||||||
|
// TODO: Fill your own fields
|
||||||
|
UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
|
||||||
|
CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function console_red() {
|
||||||
|
echo -e "\033[31m "$*" \033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
function console_green() {
|
||||||
|
echo -e "\033[32m "$*" \033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
function console_yellow() {
|
||||||
|
echo -e "\033[33m "$*" \033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
function console_blue() {
|
||||||
|
echo -e "\033[34m "$*" \033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
function console_tip() {
|
||||||
|
console_blue "========================== $* =============================="
|
||||||
|
}
|
||||||
|
|
||||||
|
function console_step() {
|
||||||
|
console_blue "<<<<<<<<<<<<<<<< $* >>>>>>>>>>>>>>>>"
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
FROM golang:1.18
|
||||||
|
|
||||||
|
ENV TZ Asia/Shanghai
|
||||||
|
ENV GOPROXY https://goproxy.cn,direct
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
ADD goctl /usr/bin/goctl
|
||||||
|
ADD cmd.sh .
|
||||||
|
|
||||||
|
RUN chmod +x /usr/bin/goctl
|
||||||
|
RUN chmod +x cmd.sh
|
||||||
|
CMD ["/bin/bash", "cmd.sh"]
|
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
wd=$(dirname $0)
|
||||||
|
project=test
|
||||||
|
testDir=$wd/$project
|
||||||
|
mkdir -p $testDir
|
||||||
|
|
||||||
|
cd $testDir
|
||||||
|
|
||||||
|
# go mod init
|
||||||
|
go mod init $project
|
||||||
|
|
||||||
|
# generate cache code
|
||||||
|
goctl model mongo -t User -c --dir cache
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# generate non-cache code
|
||||||
|
goctl model mongo -t User --dir nocache
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# go mod tidy
|
||||||
|
GOPROXY=https://goproxy.cn && go mod tidy
|
||||||
|
|
||||||
|
# code inspection
|
||||||
|
go test -race ./...
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo
|
||||||
|
fi
|
@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
|
||||||
|
# source functions
|
||||||
|
source ../../../common/echo.sh
|
||||||
|
|
||||||
|
console_tip "mongo test"
|
||||||
|
|
||||||
|
# build goctl
|
||||||
|
console_step "goctl building"
|
||||||
|
|
||||||
|
buildFile=goctl
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $buildFile ../../../../goctl.go
|
||||||
|
image=goctl-mongo:latest
|
||||||
|
|
||||||
|
# docker build
|
||||||
|
console_step "docker building"
|
||||||
|
docker build -t $image .
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
rm -f $buildFile
|
||||||
|
console_red "docker build failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# run docker image
|
||||||
|
console_step "docker running"
|
||||||
|
docker run $image
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
rm -f $buildFile
|
||||||
|
console_red "docker run failed"
|
||||||
|
docker image rm -f $image
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f $buildFile
|
||||||
|
console_green "PASS"
|
||||||
|
docker image rm -f $image > /dev/null 2>&1
|
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# main.sh is the entry point for the goctl tests.
|
||||||
|
|
||||||
|
# testing mongo code generation.
|
||||||
|
/bin/bash integration/model/mongo/mongo.sh
|
Loading…
Reference in New Issue