~bigbes/sr-ht-dolt

ref: ecfc6bb21417a3997754a5399a2cd2a73a542037 sr-ht-dolt/graph/schema.resolvers.go -rw-r--r-- 6.0 KiB
ecfc6bb2 — Eugene Blikh graph: a read schema for dolt.sr.ht at /query 3 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
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 }
)