package graph
// This file will be automatically regenerated based on the schema, any resolver
// implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.94
import (
"context"
model1 "sourcecraft.dev/bigbes/sr-ht-core/model"
"sourcecraft.dev/bigbes/sr-ht-dolt/browse"
"sourcecraft.dev/bigbes/sr-ht-dolt/graph/api"
"sourcecraft.dev/bigbes/sr-ht-dolt/graph/model"
)
// DefaultBranch is the resolver for the defaultBranch field.
func (r *databaseResolver) DefaultBranch(ctx context.Context, obj *model.Database) (*string, error) {
sess, err := r.openStore(ctx, "defaultBranch", obj.Repo)
if err != nil {
return nil, err
}
defer sess.Close()
branches, err := sess.Branches(ctx)
if err != nil {
return nil, internalError("Database.defaultBranch", err)
}
// A store nothing has been pushed to has no branches, and that is a state
// rather than a failure: null, not an error.
if len(branches) == 0 {
return nil, nil
}
name := browse.DefaultBranch(branches)
return &name, nil
}
// Branches is the resolver for the branches field.
func (r *databaseResolver) Branches(ctx context.Context, obj *model.Database) ([]*model.Branch, error) {
sess, err := r.openStore(ctx, "branches", obj.Repo)
if err != nil {
return nil, err
}
defer sess.Close()
branches, err := sess.Branches(ctx)
if err != nil {
return nil, internalError("Database.branches", err)
}
out := make([]*model.Branch, 0, len(branches))
for _, b := range branches {
out = append(out, &model.Branch{Name: b.Name, Head: b.Head})
}
return out, nil
}
// Log is the resolver for the log field.
func (r *databaseResolver) Log(ctx context.Context, obj *model.Database, ref *string, from *model1.Cursor, limit *int) (*model.CommitCursor, error) {
sess, err := r.openStore(ctx, "log", obj.Repo)
if err != nil {
return nil, err
}
defer sess.Close()
refStr, err := resolveRef(ctx, sess, ref)
if err != nil {
return nil, err
}
// No branches at all: an empty log, not an error, for the same reason
// defaultBranch answers null.
if refStr == "" {
return &model.CommitCursor{Results: []*model.Commit{}}, nil
}
commits, next, err := sess.Log(ctx, refStr, cursorNext(from), logLimit(limit))
if err != nil {
return nil, internalError("Database.log", err)
}
out := make([]*model.Commit, 0, len(commits))
for _, c := range commits {
out = append(out, &model.Commit{
Hash: c.Hash,
Author: c.Author,
Email: c.Email,
Date: c.Date,
Message: c.Message,
Parents: c.ParentHashes,
})
}
return &model.CommitCursor{Results: out, Cursor: nextCursor(next)}, nil
}
// Tables is the resolver for the tables field.
func (r *databaseResolver) Tables(ctx context.Context, obj *model.Database, ref *string) ([]*model.Table, error) {
sess, err := r.openStore(ctx, "tables", obj.Repo)
if err != nil {
return nil, err
}
defer sess.Close()
refStr, err := resolveRef(ctx, sess, ref)
if err != nil {
return nil, err
}
if refStr == "" {
return []*model.Table{}, nil
}
tables, err := sess.Tables(ctx, refStr)
if err != nil {
return nil, internalError("Database.tables", err)
}
out := make([]*model.Table, 0, len(tables))
for _, t := range tables {
columns := make([]*model.Column, 0, len(t.Columns))
for _, c := range t.Columns {
columns = append(columns, &model.Column{
Name: c.Name,
Type: c.Type,
PrimaryKey: c.PrimaryKey,
Nullable: c.Nullable,
})
}
out = append(out, &model.Table{
Name: t.Name,
Columns: columns,
RowCount: int(t.RowCount),
})
}
return out, nil
}
// ACL is the resolver for the acl field.
func (r *databaseResolver) ACL(ctx context.Context, obj *model.Database) ([]*model.ACLEntry, error) {
// Owner-only, and the empty list rather than an error for everybody else:
// who collaborates on a database you do not own is not yours to enumerate,
// and a refusal here would answer a question the caller may not ask.
caller := callerOf(ctx)
if caller == nil || caller.UserID != obj.Repo.OwnerID {
return []*model.ACLEntry{}, nil
}
entries, err := r.repos.ListACL(ctx, obj.Repo.ID)
if err != nil {
return nil, internalError("Database.acl", err)
}
out := make([]*model.ACLEntry, 0, len(entries))
for _, e := range entries {
out = append(out, &model.ACLEntry{
User: model.NewUser(e.Username),
Mode: model.AccessMode(e.Mode),
})
}
return out, nil
}
// Me is the resolver for the me field.
func (r *queryResolver) Me(ctx context.Context) (*model.User, error) {
caller := callerOf(ctx)
if caller == nil {
return nil, nil
}
return model.NewUser(caller.Username), nil
}
// Databases is the resolver for the databases field.
func (r *queryResolver) Databases(ctx context.Context, cursor *model1.Cursor, filter *model1.Filter) (*model.DatabaseCursor, error) {
repos, err := r.repos.ListReposForViewer(ctx, callerOf(ctx))
if err != nil {
return nil, internalError("databases", err)
}
return page(repos, cursor, filter), nil
}
// DatabasesByOwner is the resolver for the databasesByOwner field.
func (r *queryResolver) DatabasesByOwner(ctx context.Context, owner string, cursor *model1.Cursor, filter *model1.Filter) (*model.DatabaseCursor, error) {
repos, err := r.repos.ListReposByOwner(ctx, owner, callerOf(ctx))
if err != nil {
return nil, internalError("databasesByOwner", err)
}
return page(repos, cursor, filter), nil
}
// Database is the resolver for the database field.
func (r *queryResolver) Database(ctx context.Context, owner string, name string) (*model.Database, error) {
repo, err := r.resolveDatabase(ctx, owner, name)
if err != nil || repo == nil {
return nil, err
}
return model.NewDatabase(repo), nil
}
// Database returns api.DatabaseResolver implementation.
func (r *Resolver) Database() api.DatabaseResolver { return &databaseResolver{r} }
// Query returns api.QueryResolver implementation.
func (r *Resolver) Query() api.QueryResolver { return &queryResolver{r} }
type (
databaseResolver struct{ *Resolver }
queryResolver struct{ *Resolver }
)