Further work on note ownership and sharing

This commit is contained in:
Maximilian Friedersdorff 2025-08-23 22:18:36 +01:00
parent bb775ec55f
commit 4fda818e6e
4 changed files with 125 additions and 34 deletions

View file

@ -34,7 +34,7 @@ type Note struct {
BodyRendered template.HTML
Body []byte
Owner string
Viewers []string
Viewers map[string]struct{}
Uid string
}
@ -73,7 +73,7 @@ func Init() error {
for _, f := range files {
if !f.IsDir() {
uid := strings.TrimSuffix(f.Name(), filepath.Ext(f.Name()))
note, err := LoadNote(uid)
note, err := loadNote(uid)
if err != nil {
return err
}
@ -82,10 +82,10 @@ func Init() error {
log.Printf("Found note %s (title '%s', owner %s)", uid, title, note.Owner)
Notes.notes[note.Owner] = append(Notes.notes[note.Owner], note)
Notes.Add(note, note.Owner)
for _, viewer := range note.Viewers {
Notes.notes[viewer] = append(Notes.notes[viewer], note)
for viewer := range note.Viewers {
Notes.Add(note, viewer)
}
}
}
@ -109,8 +109,8 @@ func (ns *NoteStore) GetOne(owner string, uid string) (*Note, bool) {
return nil, false
}
func (ns *NoteStore) Add(note *Note) {
ns.notes[note.Owner] = append(ns.notes[note.Owner], note)
func (ns *NoteStore) Add(note *Note, user string) {
ns.notes[user] = append(ns.notes[user], note)
}
func fmtPath(path string) string {
@ -118,19 +118,39 @@ func fmtPath(path string) string {
}
func (n *Note) marshalFrontmatter() ([]byte, error) {
viewers := make([]string, 0, len(n.Viewers))
for viewer := range n.Viewers {
viewers = append(viewers, viewer)
}
frontmatter := make(map[string]interface{})
frontmatter["owner"] = n.Owner
frontmatter["viewers"] = n.Viewers
frontmatter["viewers"] = viewers
frontmatter["title"] = n.Title
marshaled, err := yaml.Marshal(&frontmatter)
return marshaled, err
}
func (n *Note) ViewersAsList() []string {
keys := make([]string, 0, len(n.Viewers))
for key := range n.Viewers {
keys = append(keys, key)
}
return keys
}
func NewNoteNoSave(title string, owner string) *Note {
note := &Note{Title: title, Owner: owner}
note.Viewers = make(map[string]struct{})
return note
}
func NewNote(title string, owner string) *Note {
note := &Note{Title: title, Owner: owner, Uid: rand.Text()}
note := NewNoteNoSave(title, owner)
note.Uid = rand.Text()
note.Save()
Notes.Add(note)
Notes.Add(note, note.Owner)
return note
}
@ -161,8 +181,8 @@ func (n *Note) Render() {
n.BodyRendered = template.HTML(buf.String())
}
// LoadNote from the disk. The path is derived from the title
func LoadNote(uid string) (*Note, error) {
// loadNote from the disk. The path is derived from the uid
func loadNote(uid string) (*Note, error) {
filename := filepath.Join(conf.Conf.NotesDir, fmtPath(uid))
f, err := os.Open(filename)
if err != nil {
@ -213,7 +233,9 @@ func LoadNote(uid string) (*Note, error) {
return nil, errors.New("invalid note, missing 'title' in frontmatter")
}
note := &Note{Title: title, Body: body, Owner: owner, Uid: uid}
note := NewNoteNoSave(title, owner)
note.Uid = uid
note.Body = body
viewers := metaData["viewers"].([]interface{})
@ -222,13 +244,22 @@ func LoadNote(uid string) (*Note, error) {
if !ok {
return nil, errors.New("invalid note, non string type in 'viewers' in frontmatter")
}
note.Viewers = append(note.Viewers, v)
if v == "" {
continue
}
note.AddViewer(v)
}
log.Printf("Note %s shared with %v", note.Title, note.Viewers)
return note, nil
}
func (n *Note) AddViewer(viewer string) {
n.Viewers[viewer] = struct{}{}
}
func DeleteNote(uid string) error {
filename := filepath.Join(conf.Conf.NotesDir, fmtPath(uid))
return os.Remove(filename)