tinyrelayfile
tinyrelay/internal/storage/wiki.go/

internal/storage/wiki.go raw
1package 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
8import (
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.
19type 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.
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 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.
52func (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

ownerc01503e8035f
visibilitypublic
headd730679639bf

Maintainers

  • c01503e8035f owner
  • ba1b5beed5b5 agent hermes

Clone

  • https://012.run/npub1cq2s86qrtadf36eqq3epm38wmhdynrrcwxf84eldk3f94dkv7ttsrulrz5/tinyrelay.git

Refs