diff --git a/appview/db/db.go b/appview/db/db.go index 50bb6a2c..a9f45a12 100644 --- a/appview/db/db.go +++ b/appview/db/db.go @@ -455,6 +455,14 @@ func Make(dbPath string) (*DB, error) { }) db.Exec("pragma foreign_keys = on;") + // run migrations + runMigration(db, "add-spindle-to-repos", func(tx *sql.Tx) error { + tx.Exec(` + alter table repos add column spindle text; + `) + return nil + }) + return &DB{db}, nil } diff --git a/appview/db/repos.go b/appview/db/repos.go index 4226beea..1e7072ee 100644 --- a/appview/db/repos.go +++ b/appview/db/repos.go @@ -18,6 +18,7 @@ type Repo struct { Created time.Time AtUri string Description string + Spindle string // optionally, populate this when querying for reverse mappings RepoStats *RepoStats @@ -138,21 +139,30 @@ func GetAllReposByDid(e Execer, did string) ([]Repo, error) { func GetRepo(e Execer, did, name string) (*Repo, error) { var repo Repo - var nullableDescription sql.NullString + var description, spindle sql.NullString - row := e.QueryRow(`select did, name, knot, created, at_uri, description from repos where did = ? and name = ?`, did, name) + row := e.QueryRow(` + select did, name, knot, created, at_uri, description, spindle + from repos + where did = ? and name = ? + `, + did, + name, + ) var createdAt string - if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &nullableDescription); err != nil { + if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &description, &spindle); err != nil { return nil, err } createdAtTime, _ := time.Parse(time.RFC3339, createdAt) repo.Created = createdAtTime - if nullableDescription.Valid { - repo.Description = nullableDescription.String - } else { - repo.Description = "" + if description.Valid { + repo.Description = description.String + } + + if spindle.Valid { + repo.Spindle = spindle.String } return &repo, nil @@ -305,6 +315,12 @@ func UpdateDescription(e Execer, repoAt, newDescription string) error { return err } +func UpdateSpindle(e Execer, repoAt, spindle string) error { + _, err := e.Exec( + `update repos set spindle = ? where at_uri = ?`, spindle, repoAt) + return err +} + func CollaboratingIn(e Execer, collaborator string) ([]Repo, error) { var repos []Repo diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go index f2793ed0..0d142f38 100644 --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -225,6 +225,7 @@ func (mw Middleware) ResolveRepo() middlewareFunc { ctx := context.WithValue(req.Context(), "knot", repo.Knot) ctx = context.WithValue(ctx, "repoAt", repo.AtUri) ctx = context.WithValue(ctx, "repoDescription", repo.Description) + ctx = context.WithValue(ctx, "repoSpindle", repo.Spindle) ctx = context.WithValue(ctx, "repoAddedAt", repo.Created.Format(time.RFC3339)) next.ServeHTTP(w, req.WithContext(ctx)) }) diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 29cb7608..f3e752a7 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -616,11 +616,13 @@ type Collaborator struct { } type RepoSettingsParams struct { - LoggedInUser *oauth.User - RepoInfo repoinfo.RepoInfo - Collaborators []Collaborator - Active string - Branches []types.Branch + LoggedInUser *oauth.User + RepoInfo repoinfo.RepoInfo + Collaborators []Collaborator + Active string + Branches []types.Branch + Spindles []string + CurrentSpindle string // TODO: use repoinfo.roles IsCollaboratorInviteAllowed bool } diff --git a/appview/pages/templates/repo/settings.html b/appview/pages/templates/repo/settings.html index 3dcf9dc2..00c87cf6 100644 --- a/appview/pages/templates/repo/settings.html +++ b/appview/pages/templates/repo/settings.html @@ -81,6 +81,41 @@ + {{ if .RepoInfo.Roles.IsOwner }} +
+ {{ end }} + {{ if .RepoInfo.Roles.RepoDeleteAllowed }}