Skip to content

Commit

Permalink
entproto: implement list service method (#162)
Browse files Browse the repository at this point in the history
* entproto: generate list method for service annotations

For #2107

* protoc-gen-entgrpc: generate list method handler code

For #2107

* entproto: re-generate schema

For #2107

* entproto: implement list method unit test

For #2107

* entproto: appease the linter

For #2107

* entproto: fix typo in service.go

For #2107

* protoc-gen-entgrpc: add base64 encoding to page token

For #2107

* entproto: re-generate schema

For #2107

* entproto: increase MaxPageSize

For #2107

* entproto: change page token to string

For #2107

* entproto: revert infra change

For #2107

* protoc-gen-entgrpc: simplify page token wrapping

For #2107

* entproto: re-generate schema

For #2107

* entproto: simplify list method test

For #2107

* protoc-gen-entgrpc: throw template error for unsupported id types

* protoc-gen-entgrpc: adjust formatting in method_list.tmpl

Co-authored-by: Ariel Mashraki <[email protected]>

* entproto: adjust formatting in service.go

Co-authored-by: Ariel Mashraki <[email protected]>

* entproto: go fmt service.go

* entproto: re-generate schema

* entproto: throw error in list method proto generation for unsupported id

* protoc-gen-entgrpc: remove throwError

* entproto: re-generate schema

Co-authored-by: Ariel Mashraki <[email protected]>
  • Loading branch information
JeremyV2014 and a8m authored Nov 20, 2021
1 parent fcdb5f9 commit 58b7f24
Show file tree
Hide file tree
Showing 11 changed files with 2,048 additions and 410 deletions.
77 changes: 77 additions & 0 deletions entproto/cmd/protoc-gen-entgrpc/template/method_list.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{{- /*gotype: entgo.io/contrib/entproto/cmd/protoc-gen-entgrpc.methodInput*/ -}}
{{ define "method_list" }}
{{- $inputName := .Method.Input.GoIdent.GoName -}}
var (
err error
entList []*ent.{{ .G.EntType.Name }}
pageSize int
)
pageSize = int(req.GetPageSize())
switch {
case pageSize < 0:
return nil, {{ statusErrf "InvalidArgument" "page size cannot be less than zero" }}
case pageSize == 0 || pageSize > entproto.MaxPageSize:
pageSize = {{ qualify "entgo.io/contrib/entproto" "MaxPageSize" }}
}
listQuery := svc.client.{{ .G.EntType.Name }}.Query().
Order(ent.Desc({{ qualify (print (unquote .G.EntPackage.String) "/" .G.EntType.Package) "FieldID" }})).
Limit(pageSize + 1)
if req.GetPageToken() != "" {
bytes, err := {{ qualify "encoding/base64" "StdEncoding.DecodeString" }}(req.PageToken)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "page token is invalid")
}
{{- if .G.EntType.ID.IsInt }}
token, err := {{ qualify "strconv" "ParseInt" }}(string(bytes), 10, 32)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "page token is invalid")
}
pageToken := int(token)
{{- else if .G.EntType.ID.IsUUID }}
pageToken, err := {{ qualify "github.com/google/uuid" "ParseBytes" }}(bytes)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "page token is invalid")
}
{{- else if .G.EntType.ID.IsString }}
pageToken := string(bytes)
{{- end }}
listQuery = listQuery.
Where({{ qualify (print (unquote .G.EntPackage.String) "/" .G.EntType.Package) "IDLTE" }}(pageToken))
}
switch req.GetView() {
case {{ $inputName }}_VIEW_UNSPECIFIED, {{ $inputName }}_BASIC:
entList, err = listQuery.All(ctx)
case {{ $inputName }}_WITH_EDGE_IDS:
entList, err = listQuery.
{{ range .G.FieldMap.Edges }}
{{- $et := .EntEdge.Type -}}
With{{ .EntEdge.StructField }}(func(query *ent.{{ $et.Name }}Query) {
query.Select({{ qualify (print (unquote $.G.EntPackage.String) "/" $et.Package ) $et.ID.Constant }})
}).
{{ end }}
All(ctx)
}
switch {
case err == nil:
var nextPageToken string
if len(entList) == pageSize + 1 {
nextPageToken = {{ qualify "encoding/base64" "StdEncoding.EncodeToString" }}(
[]byte({{ qualify "fmt" "Sprintf" }}("%v", entList[len(entList)-1].ID)))
entList = entList[:len(entList)-1]
}
var pbList []*{{ .G.EntType.Name }}
for _, entEntity := range entList {
pbEntity, err := toProto{{ .G.EntType.Name }}(entEntity)
if err != nil {
return nil, {{ statusErrf "Internal" "internal error: %s" "err" }}
}
pbList = append(pbList, pbEntity)
}
return &List{{ .G.EntType.Name }}Response{
{{ .G.EntType.Name }}List: pbList,
NextPageToken: nextPageToken,
}, nil
default:
return nil, {{ statusErrf "Internal" "internal error: %s" "err" }}
}
{{ end }}
2 changes: 2 additions & 0 deletions entproto/cmd/protoc-gen-entgrpc/template/service.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ func New{{ .Service.GoName }}(client *{{ .EntPackage.Ident "Client" | ident }})
{{ template "method_delete" (method .) }}
{{- else if or (eq $methodName "Create") (eq $methodName "Update") }}
{{ template "method_mutate" (method .) }}
{{- else if eq $methodName "List" }}
{{ template "method_list" (method .) }}
{{- end }}
}
{{ end }}
Expand Down
Loading

0 comments on commit 58b7f24

Please sign in to comment.