forked from tangled.org/core
this repo has no description

clean up collaborators a bit

Changed files
+67 -17
appview
db
pages
templates
state
rbac
+1 -1
appview/db/follow.go
···
}
func (d *DB) AddFollow(userDid, subjectDid, rkey string) error {
-
query := `insert into follows (user_did, subject_did, rkey) values (?, ?, ?)`
+
query := `insert or ignore into follows (user_did, subject_did, rkey) values (?, ?, ?)`
_, err := d.db.Exec(query, userDid, subjectDid, rkey)
return err
}
+1 -1
appview/db/pubkeys.go
···
)
func (d *DB) AddPublicKey(did, name, key string) error {
-
query := `insert into public_keys (did, name, key) values (?, ?, ?)`
+
query := `insert or ignore into public_keys (did, name, key) values (?, ?, ?)`
_, err := d.db.Exec(query, did, name, key)
return err
}
+7 -1
appview/pages/pages.go
···
return p.executeRepo("repo/blob", w, params)
}
+
type Collaborator struct {
+
Did string
+
Handle string
+
Role string
+
}
+
type RepoSettingsParams struct {
LoggedInUser *auth.User
RepoInfo RepoInfo
-
Collaborators [][]string
+
Collaborators []Collaborator
Active string
IsCollaboratorInviteAllowed bool
}
+16 -12
appview/pages/templates/repo/settings.html
···
{{ define "repoContent" }}
-
<h3>settings</h3>
-
<em>collaborators</em>
-
<ol>
-
{{ range .Collaborators }}
-
<li>
-
{{ index . 0 }} -
-
{{ index . 3 }}
-
</li>
-
{{ else }}
-
<p>no members</p>
-
{{ end }}
-
</ol>
+
<header class="font-bold text-sm mb-4">COLLABORATORS</header>
+
+
<div id="collaborator-list" class="flex flex-col gap-2 mb-2">
+
{{ range .Collaborators }}
+
<div id="collaborator" class="mb-2">
+
<a href="/{{ didOrHandle .Did .Handle }}" class="no-underline hover:underline text-black">
+
{{ didOrHandle .Did .Handle }}
+
</a>
+
<div>
+
<span class="text-sm text-gray-500">
+
{{ .Role }}
+
</span>
+
</div>
+
</div>
+
{{ end }}
+
</div>
{{ if .IsCollaboratorInviteAllowed }}
<h3>add collaborator</h3>
+41 -2
appview/state/repo.go
···
package state
import (
+
"context"
"encoding/json"
"fmt"
"io"
···
case http.MethodGet:
// for now, this is just pubkeys
user := s.auth.GetUser(r)
-
repoCollaborators, err := s.enforcer.E.GetImplicitUsersForResourceByDomain(f.OwnerSlashRepo(), f.Knot)
+
repoCollaborators, err := f.Collaborators(r.Context(), s)
if err != nil {
log.Println("failed to get collaborators", err)
}
-
log.Println(repoCollaborators)
isCollaboratorInviteAllowed := false
if user != nil {
···
func (f *FullyResolvedRepo) OwnerSlashRepo() string {
p, _ := securejoin.SecureJoin(f.OwnerDid(), f.RepoName)
return p
+
}
+
+
func (f *FullyResolvedRepo) Collaborators(ctx context.Context, s *State) ([]pages.Collaborator, error) {
+
repoCollaborators, err := s.enforcer.E.GetImplicitUsersForResourceByDomain(f.OwnerSlashRepo(), f.Knot)
+
if err != nil {
+
return nil, err
+
}
+
+
var collaborators []pages.Collaborator
+
for _, item := range repoCollaborators {
+
// currently only two roles: owner and member
+
var role string
+
if item[3] == "repo:owner" {
+
role = "owner"
+
} else if item[3] == "repo:collaborator" {
+
role = "collaborator"
+
} else {
+
continue
+
}
+
+
did := item[0]
+
+
var handle string
+
id, err := s.resolver.ResolveIdent(ctx, did)
+
if err != nil {
+
handle = ""
+
} else {
+
handle = string(id.Handle)
+
}
+
+
c := pages.Collaborator{
+
Did: did,
+
Handle: handle,
+
Role: role,
+
}
+
collaborators = append(collaborators, c)
+
}
+
+
return collaborators, nil
}
func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) {
+1
rbac/rbac.go
···
}
_, err := e.E.AddPolicies([][]string{
+
{collaborator, domain, repo, "repo:collaborator"},
{collaborator, domain, repo, "repo:settings"},
{collaborator, domain, repo, "repo:push"},
})