|
|
|
internal/storage/wiki.go raw
| 1 | package storage | | 2 | | | 3 | // Wiki revisions. A kind 30818 article is addressable, so a newer version | | 4 | // from the same author replaces the older one in events. The replaced | | 5 | // event is kept here with the id of the event that replaced it, until the | | 6 | // author deletes it with a kind 5 naming the revision or the page. | | 7 | | | 8 | import ( | | 9 | "context" | | 10 | "database/sql" | | 11 | "encoding/json" | | 12 | "errors" | | 13 | "fmt" | | 14 | | | 15 | "github.com/FelineStateMachine/tinyrelay/internal/event" | | 16 | ) | | 17 | | | 18 | // WikiRevision is one archived version of a wiki page. | | 19 | type WikiRevision struct { | | 20 | ID string | | 21 | Author string | | 22 | D string | | 23 | CreatedAt int64 | | 24 | SupersededBy string | | 25 | Event event.Event | | 26 | } | | 27 | | | 28 | // WikiRevisions lists archived revisions newest first. An empty author or | | 29 | // d matches every author or page. | | 30 | func (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 WikiRevision | | 39 | var raw string | | 40 | if err := rows.Scan(&row.ID, &row.Author, &row.D, &row.CreatedAt, &row.SupersededBy, &raw); err != nil { | | 41 | return nil, err | | 42 | } | | 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 | } | | 50 | | | 51 | // WikiRevision reads one archived revision by event id. | | 52 | func (s *Store) WikiRevision(ctx context.Context, id string) (WikiRevision, bool, error) { | | 53 | var row WikiRevision | | 54 | var raw string | | 55 | 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, nil | | 58 | } | | 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, nil | | 66 | } |
|
|
About| owner | c01503e8035f |
|---|
| visibility | public |
|---|
| head | d730679639bf |
|---|
Maintainers- c01503e8035f owner
- ba1b5beed5b5 agent hermes
Clonehttps://012.run/npub1cq2s86qrtadf36eqq3epm38wmhdynrrcwxf84eldk3f94dkv7ttsrulrz5/tinyrelay.git
|