clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

main
tinyrelay / internal / storage / wiki.go
wiki.go 2.2K
1package storage23// Wiki revisions. A kind 30818 article is addressable, so a newer version4// from the same author replaces the older one in events. The replaced5// event is kept here with the id of the event that replaced it, until the6// author deletes it with a kind 5 naming the revision or the page.78import (9 "context"10 "database/sql"11 "encoding/json"12 "errors"13 "fmt"1415 "github.com/FelineStateMachine/tinyrelay/internal/event"16)1718// WikiRevision is one archived version of a wiki page.19type WikiRevision struct {20 ID string21 Author string22 D string23 CreatedAt int6424 SupersededBy string25 Event event.Event26}2728// WikiRevisions lists archived revisions newest first. An empty author or29// d matches every author or page.30func (s *Store) WikiRevisions(ctx context.Context, author, d string) ([]WikiRevision, error) {31 rows, err := s.db.QueryContext(ctx, "SELECT event_id,author,d,created_at,superseded_by,raw FROM wiki_revisions WHERE (?='' OR author=?) AND (?='' OR d=?) ORDER BY created_at DESC,event_id", author, author, d, d)32 if err != nil {33 return nil, fmt.Errorf("query wiki revisions: %w", err)34 }35 defer rows.Close()36 result := []WikiRevision{}37 for rows.Next() {38 var row WikiRevision39 var raw string40 if err := rows.Scan(&row.ID, &row.Author, &row.D, &row.CreatedAt, &row.SupersededBy, &raw); err != nil {41 return nil, err42 }43 if err := json.Unmarshal([]byte(raw), &row.Event); err != nil {44 return nil, fmt.Errorf("decode wiki revision %s: %w", row.ID, err)45 }46 result = append(result, row)47 }48 return result, rows.Err()49}5051// WikiRevision reads one archived revision by event id.52func (s *Store) WikiRevision(ctx context.Context, id string) (WikiRevision, bool, error) {53 var row WikiRevision54 var raw string55 err := s.db.QueryRowContext(ctx, "SELECT event_id,author,d,created_at,superseded_by,raw FROM wiki_revisions WHERE event_id=?", id).Scan(&row.ID, &row.Author, &row.D, &row.CreatedAt, &row.SupersededBy, &raw)56 if errors.Is(err, sql.ErrNoRows) {57 return row, false, nil58 }59 if err != nil {60 return row, false, fmt.Errorf("read wiki revision: %w", err)61 }62 if err := json.Unmarshal([]byte(raw), &row.Event); err != nil {63 return row, false, fmt.Errorf("decode wiki revision %s: %w", id, err)64 }65 return row, true, nil66}