+18
-31
appview/db/repos.go
+18
-31
appview/db/repos.go
···
334
334
return repos, nil
335
335
}
336
336
337
+
// helper to get exactly one repo
338
+
func GetRepo(e Execer, filters ...filter) (*Repo, error) {
339
+
repos, err := GetRepos(e, 0, filters...)
340
+
if err != nil {
341
+
return nil, err
342
+
}
343
+
344
+
if repos == nil {
345
+
return nil, sql.ErrNoRows
346
+
}
347
+
348
+
if len(repos) != 1 {
349
+
return nil, fmt.Errorf("too many rows returned")
350
+
}
351
+
352
+
return &repos[0], nil
353
+
}
354
+
337
355
func CountRepos(e Execer, filters ...filter) (int64, error) {
338
356
var conditions []string
339
357
var args []any
···
356
374
}
357
375
358
376
return count, nil
359
-
}
360
-
361
-
func GetRepo(e Execer, did, name string) (*Repo, error) {
362
-
var repo Repo
363
-
var description, spindle sql.NullString
364
-
365
-
row := e.QueryRow(`
366
-
select did, name, knot, created, description, spindle, rkey
367
-
from repos
368
-
where did = ? and name = ?
369
-
`,
370
-
did,
371
-
name,
372
-
)
373
-
374
-
var createdAt string
375
-
if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &description, &spindle, &repo.Rkey); err != nil {
376
-
return nil, err
377
-
}
378
-
createdAtTime, _ := time.Parse(time.RFC3339, createdAt)
379
-
repo.Created = createdAtTime
380
-
381
-
if description.Valid {
382
-
repo.Description = description.String
383
-
}
384
-
385
-
if spindle.Valid {
386
-
repo.Spindle = spindle.String
387
-
}
388
-
389
-
return &repo, nil
390
377
}
391
378
392
379
func GetRepoByAtUri(e Execer, atUri string) (*Repo, error) {
+1
-1
appview/issues/router.go
+1
-1
appview/issues/router.go
+38
-37
appview/middleware/middleware.go
+38
-37
appview/middleware/middleware.go
···
213
213
return
214
214
}
215
215
216
-
repo, err := db.GetRepo(mw.db, id.DID.String(), repoName)
216
+
repo, err := db.GetRepo(
217
+
mw.db,
218
+
db.FilterEq("did", id.DID.String()),
219
+
db.FilterEq("name", repoName),
220
+
)
217
221
if err != nil {
218
-
// invalid did or handle
219
-
log.Println("failed to resolve repo")
222
+
log.Println("failed to resolve repo", "err", err)
220
223
mw.pages.ErrorKnot404(w)
221
224
return
222
225
}
···
276
279
}
277
280
278
281
// middleware that is tacked on top of /{user}/{repo}/issues/{issue}
279
-
func (mw Middleware) ResolveIssue() middlewareFunc {
280
-
return func(next http.Handler) http.Handler {
281
-
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
282
-
f, err := mw.repoResolver.Resolve(r)
283
-
if err != nil {
284
-
log.Println("failed to fully resolve repo", err)
285
-
mw.pages.ErrorKnot404(w)
286
-
return
287
-
}
282
+
func (mw Middleware) ResolveIssue(next http.Handler) http.Handler {
283
+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
284
+
f, err := mw.repoResolver.Resolve(r)
285
+
if err != nil {
286
+
log.Println("failed to fully resolve repo", err)
287
+
mw.pages.ErrorKnot404(w)
288
+
return
289
+
}
288
290
289
-
issueIdStr := chi.URLParam(r, "issue")
290
-
issueId, err := strconv.Atoi(issueIdStr)
291
-
if err != nil {
292
-
log.Println("failed to fully resolve issue ID", err)
293
-
mw.pages.ErrorKnot404(w)
294
-
return
295
-
}
291
+
issueIdStr := chi.URLParam(r, "issue")
292
+
issueId, err := strconv.Atoi(issueIdStr)
293
+
if err != nil {
294
+
log.Println("failed to fully resolve issue ID", err)
295
+
mw.pages.ErrorKnot404(w)
296
+
return
297
+
}
296
298
297
-
issues, err := db.GetIssues(
298
-
mw.db,
299
-
db.FilterEq("repo_at", f.RepoAt()),
300
-
db.FilterEq("issue_id", issueId),
301
-
)
302
-
if err != nil {
303
-
log.Println("failed to get issues", "err", err)
304
-
return
305
-
}
306
-
if len(issues) != 1 {
307
-
log.Println("got incorrect number of issues", "len(issuse)", len(issues))
308
-
return
309
-
}
310
-
issue := issues[0]
299
+
issues, err := db.GetIssues(
300
+
mw.db,
301
+
db.FilterEq("repo_at", f.RepoAt()),
302
+
db.FilterEq("issue_id", issueId),
303
+
)
304
+
if err != nil {
305
+
log.Println("failed to get issues", "err", err)
306
+
return
307
+
}
308
+
if len(issues) != 1 {
309
+
log.Println("got incorrect number of issues", "len(issuse)", len(issues))
310
+
return
311
+
}
312
+
issue := issues[0]
311
313
312
-
ctx := context.WithValue(r.Context(), "issue", &issue)
313
-
next.ServeHTTP(w, r.WithContext(ctx))
314
-
})
315
-
}
314
+
ctx := context.WithValue(r.Context(), "issue", &issue)
315
+
next.ServeHTTP(w, r.WithContext(ctx))
316
+
})
316
317
}
317
318
318
319
// this should serve the go-import meta tag even if the path is technically
+6
-2
appview/pulls/pulls.go
+6
-2
appview/pulls/pulls.go
···
1364
1364
forkOwnerDid := repoString[0]
1365
1365
forkName := repoString[1]
1366
1366
// fork repo
1367
-
repo, err := db.GetRepo(s.db, forkOwnerDid, forkName)
1367
+
repo, err := db.GetRepo(
1368
+
s.db,
1369
+
db.FilterEq("did", forkOwnerDid),
1370
+
db.FilterEq("name", forkName),
1371
+
)
1368
1372
if err != nil {
1369
-
log.Println("failed to get repo", user.Did, forkVal)
1373
+
log.Println("failed to get repo", "did", forkOwnerDid, "name", forkName, "err", err)
1370
1374
return
1371
1375
}
1372
1376
+5
-1
appview/repo/repo.go
+5
-1
appview/repo/repo.go
···
1580
1580
forkName := f.Name
1581
1581
// this check is *only* to see if the forked repo name already exists
1582
1582
// in the user's account.
1583
-
existingRepo, err := db.GetRepo(rp.db, user.Did, f.Name)
1583
+
existingRepo, err := db.GetRepo(
1584
+
rp.db,
1585
+
db.FilterEq("did", user.Did),
1586
+
db.FilterEq("name", f.Name),
1587
+
)
1584
1588
if err != nil {
1585
1589
if errors.Is(err, sql.ErrNoRows) {
1586
1590
// no existing repo with this name found, we can use the name as is
+5
-1
appview/state/state.go
+5
-1
appview/state/state.go
···
419
419
}
420
420
421
421
// Check for existing repos
422
-
existingRepo, err := db.GetRepo(s.db, user.Did, repoName)
422
+
existingRepo, err := db.GetRepo(
423
+
s.db,
424
+
db.FilterEq("did", user.Did),
425
+
db.FilterEq("name", repoName),
426
+
)
423
427
if err == nil && existingRepo != nil {
424
428
l.Info("repo exists")
425
429
s.pages.Notice(w, "repo", fmt.Sprintf("You already have a repository by this name on %s", existingRepo.Knot))
+1
-1
spindle/ingester.go
+1
-1
spindle/ingester.go