feat: use go:embed to embed templates (#1756)
parent
58a0b17451
commit
faad6e27e3
@ -0,0 +1,24 @@
|
|||||||
|
syntax = "v1"
|
||||||
|
|
||||||
|
info (
|
||||||
|
title: // TODO: add title
|
||||||
|
desc: // TODO: add description
|
||||||
|
author: "{{.gitUser}}"
|
||||||
|
email: "{{.gitEmail}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
type request {
|
||||||
|
// TODO: add members here and delete this comment
|
||||||
|
}
|
||||||
|
|
||||||
|
type response {
|
||||||
|
// TODO: add members here and delete this comment
|
||||||
|
}
|
||||||
|
|
||||||
|
service {{.serviceName}} {
|
||||||
|
@handler GetUser // TODO: set handler name and delete this comment
|
||||||
|
get /users/id/:userId(request) returns(response)
|
||||||
|
|
||||||
|
@handler CreateUser // TODO: set handler name and delete this comment
|
||||||
|
post /users/create(request)
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
### {{.index}}. {{.routeComment}}
|
||||||
|
|
||||||
|
1. route definition
|
||||||
|
|
||||||
|
- Url: {{.uri}}
|
||||||
|
- Method: {{.method}}
|
||||||
|
- Request: {{.requestType}}
|
||||||
|
- Response: {{.responseType}}
|
||||||
|
|
||||||
|
2. request definition
|
||||||
|
|
||||||
|
{{.requestContent}}
|
||||||
|
|
||||||
|
3. response definition
|
||||||
|
|
||||||
|
{{.responseContent}}
|
@ -0,0 +1,3 @@
|
|||||||
|
Name: {{.serviceName}}
|
||||||
|
Host: {{.host}}
|
||||||
|
Port: {{.port}}
|
@ -0,0 +1,26 @@
|
|||||||
|
package {{.PkgName}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
{{if .After1_1_10}}"github.com/zeromicro/go-zero/rest/httpx"{{end}}
|
||||||
|
{{.ImportPackages}}
|
||||||
|
)
|
||||||
|
|
||||||
|
func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
{{if .HasRequest}}var req types.{{.RequestType}}
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
httpx.Error(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
|
||||||
|
{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
|
||||||
|
if err != nil {
|
||||||
|
httpx.Error(w, err)
|
||||||
|
} else {
|
||||||
|
{{if .HasResp}}httpx.OkJson(w, resp){{else}}httpx.Ok(w){{end}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package {{.pkgName}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
{{.imports}}
|
||||||
|
)
|
||||||
|
|
||||||
|
type {{.logic}} struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func New{{.logic}}(ctx context.Context, svcCtx *svc.ServiceContext) *{{.logic}} {
|
||||||
|
return &{{.logic}}{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *{{.logic}}) {{.function}}({{.request}}) {{.responseType}} {
|
||||||
|
// todo: add your logic here and delete this line
|
||||||
|
|
||||||
|
{{.returnString}}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
{{.importPackages}}
|
||||||
|
)
|
||||||
|
|
||||||
|
var configFile = flag.String("f", "etc/{{.serviceName}}.yaml", "the config file")
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
var c config.Config
|
||||||
|
conf.MustLoad(*configFile, &c)
|
||||||
|
|
||||||
|
ctx := svc.NewServiceContext(c)
|
||||||
|
server := rest.MustNewServer(c.RestConf)
|
||||||
|
defer server.Stop()
|
||||||
|
|
||||||
|
handler.RegisterHandlers(server, ctx)
|
||||||
|
|
||||||
|
fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
|
||||||
|
server.Start()
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
type {{.name}} struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func New{{.name}}() *{{.name}} {
|
||||||
|
return &{{.name}}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *{{.name}})Handle(next http.HandlerFunc) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// TODO generate middleware implement function, delete after code implementation
|
||||||
|
|
||||||
|
// Passthrough to next handler if need
|
||||||
|
next(w, r)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package svc
|
||||||
|
|
||||||
|
import (
|
||||||
|
{{.configImport}}
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServiceContext struct {
|
||||||
|
Config {{.config}}
|
||||||
|
{{.middleware}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServiceContext(c {{.config}}) *ServiceContext {
|
||||||
|
return &ServiceContext{
|
||||||
|
Config: c,
|
||||||
|
{{.middlewareAssignment}}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
// Code generated by goctl. DO NOT EDIT.
|
||||||
|
package types{{if .containsTime}}
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
){{end}}
|
||||||
|
{{.types}}
|
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
{{.indent}}{{.decorator}}
|
||||||
|
{{.indent}}public {{.returnType}} is{{.property}}() {
|
||||||
|
{{.indent}} return this.{{.tagValue}};
|
||||||
|
{{.indent}}}
|
||||||
|
|
||||||
|
{{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
|
||||||
|
{{.indent}} this.{{.tagValue}} = {{.propertyValue}};
|
||||||
|
{{.indent}}}
|
@ -0,0 +1,22 @@
|
|||||||
|
// Code generated by goctl. DO NOT EDIT.
|
||||||
|
package com.xhb.logic.http.packet.{{.packet}}.model;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
{{.imports}}
|
||||||
|
|
||||||
|
public class {{.className}} extends {{.superClassName}} {
|
||||||
|
|
||||||
|
{{.properties}}
|
||||||
|
{{if .HasProperty}}
|
||||||
|
|
||||||
|
public {{.className}}() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public {{.className}}({{.params}}) {
|
||||||
|
{{.constructorSetter}}
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{.getSet}}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
{{.indent}}{{.decorator}}
|
||||||
|
{{.indent}}public {{.returnType}} get{{.property}}() {
|
||||||
|
{{.indent}} return this.{{.tagValue}};
|
||||||
|
{{.indent}}}
|
||||||
|
|
||||||
|
{{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
|
||||||
|
{{.indent}} this.{{.tagValue}} = {{.propertyValue}};
|
||||||
|
{{.indent}}}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.xhb.logic.http.packet.{{.packet}};
|
||||||
|
|
||||||
|
import com.xhb.core.packet.HttpPacket;
|
||||||
|
import com.xhb.core.network.HttpRequestClient;
|
||||||
|
{{.imports}}
|
||||||
|
|
||||||
|
{{.doc}}
|
||||||
|
public class {{.packetName}} extends HttpPacket<{{.responseType}}> {
|
||||||
|
{{.paramsDeclaration}}
|
||||||
|
|
||||||
|
public {{.packetName}}({{.params}}{{if .HasRequestBody}}{{.requestType}} request{{end}}) {
|
||||||
|
{{if .HasRequestBody}}super(request);{{else}}super(EmptyRequest.instance);{{end}}
|
||||||
|
{{if .HasRequestBody}}this.request = request;{{end}}{{.paramsSetter}}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HttpRequestClient.Method requestMethod() {
|
||||||
|
return HttpRequestClient.Method.{{.method}};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String requestUri() {
|
||||||
|
return {{.uri}};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package {{with .Info}}{{.Desc}}{{end}}
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
|
||||||
|
object {{with .Info}}{{.Title}}{{end}}{
|
||||||
|
{{range .Types}}
|
||||||
|
data class {{.Name}}({{$length := (len .Members)}}{{range $i,$item := .Members}}
|
||||||
|
val {{with $item}}{{lowCamelCase .Name}}: {{parseType .Type.Name}}{{end}}{{if ne $i (add $length -1)}},{{end}}{{end}}
|
||||||
|
){{end}}
|
||||||
|
{{with .Service}}
|
||||||
|
{{range .Routes}}suspend fun {{routeToFuncName .Method .Path}}({{with .RequestType}}{{if ne .Name ""}}
|
||||||
|
req:{{.Name}},{{end}}{{end}}
|
||||||
|
onOk: (({{with .ResponseType}}{{.Name}}{{end}}) -> Unit)? = null,
|
||||||
|
onFail: ((String) -> Unit)? = null,
|
||||||
|
eventually: (() -> Unit)? = null
|
||||||
|
){
|
||||||
|
apiRequest("{{upperCase .Method}}","{{.Path}}",{{with .RequestType}}{{if ne .Name ""}}body=req,{{end}}{{end}} onOk = { {{with .ResponseType}}
|
||||||
|
onOk?.invoke({{if ne .Name ""}}Gson().fromJson(it,{{.Name}}::class.java){{end}}){{end}}
|
||||||
|
}, onFail = onFail, eventually =eventually)
|
||||||
|
}
|
||||||
|
{{end}}{{end}}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package {{.}}
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
import java.io.OutputStreamWriter
|
||||||
|
import java.net.HttpURLConnection
|
||||||
|
import java.net.URL
|
||||||
|
|
||||||
|
const val SERVER = "http://localhost:8080"
|
||||||
|
|
||||||
|
suspend fun apiRequest(
|
||||||
|
method: String,
|
||||||
|
uri: String,
|
||||||
|
body: Any = "",
|
||||||
|
onOk: ((String) -> Unit)? = null,
|
||||||
|
onFail: ((String) -> Unit)? = null,
|
||||||
|
eventually: (() -> Unit)? = null
|
||||||
|
) = withContext(Dispatchers.IO) {
|
||||||
|
val url = URL(SERVER + uri)
|
||||||
|
with(url.openConnection() as HttpURLConnection) {
|
||||||
|
connectTimeout = 3000
|
||||||
|
requestMethod = method
|
||||||
|
doInput = true
|
||||||
|
if (method == "POST" || method == "PUT" || method == "PATCH") {
|
||||||
|
setRequestProperty("Content-Type", "application/json")
|
||||||
|
doOutput = true
|
||||||
|
val data = when (body) {
|
||||||
|
is String -> {
|
||||||
|
body
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
Gson().toJson(body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val wr = OutputStreamWriter(outputStream)
|
||||||
|
wr.write(data)
|
||||||
|
wr.flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (responseCode >= 400) {
|
||||||
|
BufferedReader(InputStreamReader(errorStream)).use {
|
||||||
|
val response = it.readText()
|
||||||
|
onFail?.invoke(response)
|
||||||
|
}
|
||||||
|
return@with
|
||||||
|
}
|
||||||
|
//response
|
||||||
|
BufferedReader(InputStreamReader(inputStream)).use {
|
||||||
|
val response = it.readText()
|
||||||
|
onOk?.invoke(response)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.message?.let { onFail?.invoke(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eventually?.invoke()
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
type Request {
|
||||||
|
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
|
||||||
|
}
|
||||||
|
|
||||||
|
type Response {
|
||||||
|
Message string ` + "`" + `json:"message"` + "`" + `
|
||||||
|
}
|
||||||
|
|
||||||
|
service {{.name}}-api {
|
||||||
|
@handler {{.handler}}Handler
|
||||||
|
get /from/:name(Request) returns (Response)
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
/ Code generated by goctl. DO NOT EDIT.
|
||||||
|
|
||||||
|
{{.componentTypes}}
|
@ -0,0 +1,3 @@
|
|||||||
|
{{.imports}}
|
||||||
|
|
||||||
|
{{.apis}}
|
@ -0,0 +1,32 @@
|
|||||||
|
FROM golang:{{.Version}}alpine AS builder
|
||||||
|
|
||||||
|
LABEL stage=gobuilder
|
||||||
|
|
||||||
|
ENV CGO_ENABLED 0
|
||||||
|
{{if .Chinese}}ENV GOPROXY https://goproxy.cn,direct
|
||||||
|
{{end}}{{if .HasTimezone}}
|
||||||
|
RUN apk update --no-cache && apk add --no-cache tzdata
|
||||||
|
{{end}}
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
ADD go.mod .
|
||||||
|
ADD go.sum .
|
||||||
|
RUN go mod download
|
||||||
|
COPY . .
|
||||||
|
{{if .Argument}}COPY {{.GoRelPath}}/etc /app/etc
|
||||||
|
{{end}}RUN go build -ldflags="-s -w" -o /app/{{.ExeFile}} {{.GoRelPath}}/{{.GoFile}}
|
||||||
|
|
||||||
|
|
||||||
|
FROM {{.BaseImage}}
|
||||||
|
|
||||||
|
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
|
||||||
|
{{if .HasTimezone}}COPY --from=builder /usr/share/zoneinfo/{{.Timezone}} /usr/share/zoneinfo/{{.Timezone}}
|
||||||
|
ENV TZ {{.Timezone}}
|
||||||
|
{{end}}
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /app/{{.ExeFile}} /app/{{.ExeFile}}{{if .Argument}}
|
||||||
|
COPY --from=builder /app/etc /app/etc{{end}}
|
||||||
|
{{if .HasPort}}
|
||||||
|
EXPOSE {{.Port}}
|
||||||
|
{{end}}
|
||||||
|
CMD ["./{{.ExeFile}}"{{.Argument}}]
|
@ -0,0 +1,6 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var ErrNotFound = errors.New("not found")
|
||||||
|
var ErrInvalidObjectId = errors.New("invalid objectId")
|
@ -0,0 +1,98 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/globalsign/mgo/bson"
|
||||||
|
{{if .Cache}}cachec "github.com/zeromicro/go-zero/core/stores/cache"
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/mongoc"{{else}}"github.com/zeromicro/go-zero/core/stores/mongo"{{end}}
|
||||||
|
)
|
||||||
|
|
||||||
|
{{if .Cache}}var prefix{{.Type}}CacheKey = "cache:{{.Type}}:"{{end}}
|
||||||
|
|
||||||
|
type {{.Type}}Model interface{
|
||||||
|
Insert(ctx context.Context,data *{{.Type}}) error
|
||||||
|
FindOne(ctx context.Context,id string) (*{{.Type}}, error)
|
||||||
|
Update(ctx context.Context,data *{{.Type}}) error
|
||||||
|
Delete(ctx context.Context,id string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type default{{.Type}}Model struct {
|
||||||
|
{{if .Cache}}*mongoc.Model{{else}}*mongo.Model{{end}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func New{{.Type}}Model(url, collection string{{if .Cache}}, c cachec.CacheConf{{end}}) {{.Type}}Model {
|
||||||
|
return &default{{.Type}}Model{
|
||||||
|
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 {
|
||||||
|
if !data.ID.Valid() {
|
||||||
|
data.ID = bson.NewObjectId()
|
||||||
|
}
|
||||||
|
|
||||||
|
session, err := m.TakeSession()
|
||||||
|
if err != nil {
|
||||||
|
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) {
|
||||||
|
if !bson.IsObjectIdHex(id) {
|
||||||
|
return nil, ErrInvalidObjectId
|
||||||
|
}
|
||||||
|
|
||||||
|
session, err := m.TakeSession()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer m.PutSession(session)
|
||||||
|
var data {{.Type}}
|
||||||
|
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
||||||
|
err = m.GetCollection(session).FindOneId(&data, key, bson.ObjectIdHex(id))
|
||||||
|
{{- else}}
|
||||||
|
err = m.GetCollection(session).FindId(bson.ObjectIdHex(id)).One(&data)
|
||||||
|
{{- end}}
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
return &data,nil
|
||||||
|
case {{if .Cache}}mongoc.ErrNotFound{{else}}mongo.ErrNotFound{{end}}:
|
||||||
|
return nil,ErrNotFound
|
||||||
|
default:
|
||||||
|
return nil,err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *default{{.Type}}Model) Update(ctx context.Context, data *{{.Type}}) error {
|
||||||
|
session, err := m.TakeSession()
|
||||||
|
if err != nil {
|
||||||
|
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 {
|
||||||
|
session, err := m.TakeSession()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer m.PutSession(session)
|
||||||
|
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
||||||
|
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id), key)
|
||||||
|
{{- else}}
|
||||||
|
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id))
|
||||||
|
{{- end}}
|
||||||
|
}
|
@ -1,112 +1,11 @@
|
|||||||
package template
|
package template
|
||||||
|
|
||||||
// Text provides the default template for model to generate
|
import _ "embed"
|
||||||
var Text = `package model
|
|
||||||
|
|
||||||
import (
|
// Text provides the default template for model to generate.
|
||||||
"context"
|
//go:embed model.tpl
|
||||||
|
var Text string
|
||||||
"github.com/globalsign/mgo/bson"
|
|
||||||
{{if .Cache}}cachec "github.com/zeromicro/go-zero/core/stores/cache"
|
|
||||||
"github.com/zeromicro/go-zero/core/stores/mongoc"{{else}}"github.com/zeromicro/go-zero/core/stores/mongo"{{end}}
|
|
||||||
)
|
|
||||||
|
|
||||||
{{if .Cache}}var prefix{{.Type}}CacheKey = "cache:{{.Type}}:"{{end}}
|
|
||||||
|
|
||||||
type {{.Type}}Model interface{
|
|
||||||
Insert(ctx context.Context,data *{{.Type}}) error
|
|
||||||
FindOne(ctx context.Context,id string) (*{{.Type}}, error)
|
|
||||||
Update(ctx context.Context,data *{{.Type}}) error
|
|
||||||
Delete(ctx context.Context,id string) error
|
|
||||||
}
|
|
||||||
|
|
||||||
type default{{.Type}}Model struct {
|
|
||||||
{{if .Cache}}*mongoc.Model{{else}}*mongo.Model{{end}}
|
|
||||||
}
|
|
||||||
|
|
||||||
func New{{.Type}}Model(url, collection string{{if .Cache}}, c cachec.CacheConf{{end}}) {{.Type}}Model {
|
|
||||||
return &default{{.Type}}Model{
|
|
||||||
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 {
|
|
||||||
if !data.ID.Valid() {
|
|
||||||
data.ID = bson.NewObjectId()
|
|
||||||
}
|
|
||||||
|
|
||||||
session, err := m.TakeSession()
|
|
||||||
if err != nil {
|
|
||||||
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) {
|
|
||||||
if !bson.IsObjectIdHex(id) {
|
|
||||||
return nil, ErrInvalidObjectId
|
|
||||||
}
|
|
||||||
|
|
||||||
session, err := m.TakeSession()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer m.PutSession(session)
|
|
||||||
var data {{.Type}}
|
|
||||||
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
|
||||||
err = m.GetCollection(session).FindOneId(&data, key, bson.ObjectIdHex(id))
|
|
||||||
{{- else}}
|
|
||||||
err = m.GetCollection(session).FindId(bson.ObjectIdHex(id)).One(&data)
|
|
||||||
{{- end}}
|
|
||||||
switch err {
|
|
||||||
case nil:
|
|
||||||
return &data,nil
|
|
||||||
case {{if .Cache}}mongoc.ErrNotFound{{else}}mongo.ErrNotFound{{end}}:
|
|
||||||
return nil,ErrNotFound
|
|
||||||
default:
|
|
||||||
return nil,err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *default{{.Type}}Model) Update(ctx context.Context, data *{{.Type}}) error {
|
|
||||||
session, err := m.TakeSession()
|
|
||||||
if err != nil {
|
|
||||||
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 {
|
|
||||||
session, err := m.TakeSession()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer m.PutSession(session)
|
|
||||||
{{if .Cache}}key := prefix{{.Type}}CacheKey + id
|
|
||||||
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id), key)
|
|
||||||
{{- else}}
|
|
||||||
return m.GetCollection(session).RemoveId(bson.ObjectIdHex(id))
|
|
||||||
{{- end}}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
// Error provides the default template for error definition in mongo code generation.
|
// Error provides the default template for error definition in mongo code generation.
|
||||||
var Error = `
|
//go:embed error.tpl
|
||||||
package model
|
var Error string
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
var ErrNotFound = errors.New("not found")
|
|
||||||
var ErrInvalidObjectId = errors.New("invalid objectId")
|
|
||||||
`
|
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
{{.head}}
|
||||||
|
|
||||||
|
package {{.filePackage}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
{{.pbPackage}}
|
||||||
|
{{if ne .pbPackage .protoGoPackage}}{{.protoGoPackage}}{{end}}
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/zrpc"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
{{.alias}}
|
||||||
|
|
||||||
|
{{.serviceName}} interface {
|
||||||
|
{{.interface}}
|
||||||
|
}
|
||||||
|
|
||||||
|
default{{.serviceName}} struct {
|
||||||
|
cli zrpc.Client
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func New{{.serviceName}}(cli zrpc.Client) {{.serviceName}} {
|
||||||
|
return &default{{.serviceName}}{
|
||||||
|
cli: cli,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{.functions}}
|
@ -0,0 +1,7 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "github.com/zeromicro/go-zero/zrpc"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
zrpc.RpcServerConf
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
Name: {{.serviceName}}.rpc
|
||||||
|
ListenOn: 127.0.0.1:8080
|
||||||
|
Etcd:
|
||||||
|
Hosts:
|
||||||
|
- 127.0.0.1:2379
|
||||||
|
Key: {{.serviceName}}.rpc
|
@ -0,0 +1,24 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
{{.imports}}
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type {{.logicName}} struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func New{{.logicName}}(ctx context.Context,svcCtx *svc.ServiceContext) *{{.logicName}} {
|
||||||
|
return &{{.logicName}}{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{.functions}}
|
@ -0,0 +1,37 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
{{.imports}}
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/conf"
|
||||||
|
"github.com/zeromicro/go-zero/core/service"
|
||||||
|
"github.com/zeromicro/go-zero/zrpc"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/reflection"
|
||||||
|
)
|
||||||
|
|
||||||
|
var configFile = flag.String("f", "etc/{{.serviceName}}.yaml", "the config file")
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
var c config.Config
|
||||||
|
conf.MustLoad(*configFile, &c)
|
||||||
|
ctx := svc.NewServiceContext(c)
|
||||||
|
svr := server.New{{.serviceNew}}Server(ctx)
|
||||||
|
|
||||||
|
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
|
||||||
|
{{.pkg}}.Register{{.service}}Server(grpcServer, svr)
|
||||||
|
|
||||||
|
if c.Mode == service.DevMode || c.Mode == service.TestMode {
|
||||||
|
reflection.Register(grpcServer)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
defer s.Stop()
|
||||||
|
|
||||||
|
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
|
||||||
|
s.Start()
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package {{.package}};
|
||||||
|
option go_package="./{{.package}}";
|
||||||
|
|
||||||
|
message Request {
|
||||||
|
string ping = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Response {
|
||||||
|
string pong = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
service {{.serviceName}} {
|
||||||
|
rpc Ping(Request) returns(Response);
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{{.head}}
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
{{if .notStream}}"context"{{end}}
|
||||||
|
|
||||||
|
{{.imports}}
|
||||||
|
)
|
||||||
|
|
||||||
|
type {{.server}}Server struct {
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
{{.unimplementedServer}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func New{{.server}}Server(svcCtx *svc.ServiceContext) *{{.server}}Server {
|
||||||
|
return &{{.server}}Server{
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{.funcs}}
|
@ -0,0 +1,13 @@
|
|||||||
|
package svc
|
||||||
|
|
||||||
|
import {{.imports}}
|
||||||
|
|
||||||
|
type ServiceContext struct {
|
||||||
|
Config config.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServiceContext(c config.Config) *ServiceContext {
|
||||||
|
return &ServiceContext{
|
||||||
|
Config:c,
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue