diff --git a/starter/ent/schema/google_auth.go b/starter/ent/schema/google_auth.go index fd4a277..a73f1c5 100644 --- a/starter/ent/schema/google_auth.go +++ b/starter/ent/schema/google_auth.go @@ -1,8 +1,6 @@ package schema import ( - ersteller_ent "git.gorlug.de/code/ersteller/schema/ent" - "entgo.io/ent" "entgo.io/ent/schema/edge" "entgo.io/ent/schema/field" @@ -14,7 +12,7 @@ type GoogleAuth struct { func (GoogleAuth) Mixin() []ent.Mixin { return []ent.Mixin{ - ersteller_ent.TimeMixin{}, + TimeMixin{}, } } diff --git a/starter/ent/schema/pagination_query.tmpl b/starter/ent/schema/pagination_query.tmpl new file mode 100644 index 0000000..aba8daf --- /dev/null +++ b/starter/ent/schema/pagination_query.tmpl @@ -0,0 +1,52 @@ +{{ define "pagination_query" }} +// Code generated by entc template, DO NOT EDIT. + +{{/* A template that adds the functionality for running each client in debug mode */}} + +{{/* Add the base header for the generated file */}} +{{ $pkg := base $.Config.Package }} +{{ template "header" $ }} + +{{ range $n := $.Nodes }} + +// PaginateAfterID paginates {{ $n.Name }} by monotonically increasing "id". +// It preserves any existing filters/joins applied to the query, fetches up to "limit" items, +// and returns the next cursor (last ID of this page) and whether a next page exists. +func (q *{{ $n.Name }}Query) PaginateAfterID(ctx context.Context, afterID, limit int) ([]*{{ $n.Name }}, int, bool, error) { + if limit <= 0 { + limit = 20 + } + + qq := q.Clone(). + Order(func(s *sql.Selector) { + s.OrderBy(s.C("id")) + }). + Limit(limit + 1) // fetch one extra to detect "has next" + + if afterID > 0 { + qq = qq.Where(func(s *sql.Selector) { + s.Where(sql.GT(s.C("id"), afterID)) + }) + } + + rows, err := qq.All(ctx) + if err != nil { + return nil, 0, false, err + } + + hasNext := len(rows) > limit + if hasNext { + rows = rows[:limit] + } + + next := 0 + if len(rows) > 0 { + next = rows[len(rows)-1].ID + } + + return rows, next, hasNext, nil +} + +{{ end }} + +{{ end }} \ No newline at end of file diff --git a/starter/ent/schema/time_mixin.go b/starter/ent/schema/time_mixin.go new file mode 100644 index 0000000..d4fa1b0 --- /dev/null +++ b/starter/ent/schema/time_mixin.go @@ -0,0 +1,27 @@ +package schema + +import ( + "time" + + "entgo.io/ent" + "entgo.io/ent/schema/field" + "entgo.io/ent/schema/mixin" +) + +// TimeMixin implements the ent.Mixin for sharing +// time fields with package schemas. +type TimeMixin struct { + mixin.Schema +} + +// Fields of the TimeMixin. +func (TimeMixin) Fields() []ent.Field { + return []ent.Field{ + field.Time("created_at"). + Default(time.Now). + Immutable(), + field.Time("updated_at"). + Default(time.Now). + UpdateDefault(time.Now), + } +} diff --git a/starter/ent/schema/todo.go b/starter/ent/schema/todo.go index 0a29067..9ff6c24 100644 --- a/starter/ent/schema/todo.go +++ b/starter/ent/schema/todo.go @@ -1,8 +1,6 @@ package schema import ( - "git.gorlug.de/code/ersteller/schema/ent" - "entgo.io/ent" "entgo.io/ent/schema/edge" "entgo.io/ent/schema/field" @@ -14,7 +12,7 @@ type Todo struct { func (Todo) Mixin() []ent.Mixin { return []ent.Mixin{ - ersteller_ent.TimeMixin{}, + TimeMixin{}, } } diff --git a/starter/ent/schema/user.go b/starter/ent/schema/user.go index 84ac46e..6fabfe1 100644 --- a/starter/ent/schema/user.go +++ b/starter/ent/schema/user.go @@ -1,8 +1,6 @@ package schema import ( - "git.gorlug.de/code/ersteller/schema/ent" - "entgo.io/ent" "entgo.io/ent/schema/field" ) @@ -14,7 +12,7 @@ type User struct { func (User) Mixin() []ent.Mixin { return []ent.Mixin{ - ersteller_ent.TimeMixin{}, + TimeMixin{}, } } diff --git a/starter/generate_schema.go b/starter/generate_schema.go index 883afeb..d4f6329 100644 --- a/starter/generate_schema.go +++ b/starter/generate_schema.go @@ -1,10 +1,11 @@ package main import ( - "git.gorlug.de/code/ersteller/starter/create" "log" "path" + "git.gorlug.de/code/ersteller/starter/create" + "entgo.io/ent/entc" "entgo.io/ent/entc/gen" ) @@ -12,7 +13,7 @@ import ( func main() { log.Println("starter generate schema") thisDir := create.GetPathToThisDir() - paginationPath := path.Join(thisDir, "../../schema/ent/pagination_query.tmpl") + paginationPath := path.Join(thisDir, "./ent/schema/pagination_query.tmpl") must(entc.Generate( "./ent/schema",