1package userbase
2
3import (
4 "encoding/json"
5)
6
7type documentV1 struct {
8 ExportVersion int `json:"export_version"`
9 ExportedAt int64 `json:"exported_at"`
10 NextUIDNumber int64 `json:"next_uid_number"`
11 NextGIDNumber int64 `json:"next_gid_number"`
12 Users []userV3 `json:"users"`
13 Groups []group `json:"groups"`
14 Memberships []membership `json:"memberships"`
15 GoogleLinks []googleLinkV3 `json:"google_links"`
16 Invitations []invitationV1 `json:"invitations"`
17 DexKeys json.RawMessage `json:"dex_keys,omitempty"`
18}
19
20type invitationV1 struct {
21 ID string `json:"id"`
22 TokenHash []byte `json:"token_hash"`
23 Email *string `json:"email"`
24 CreatedBy *string `json:"created_by"`
25 CreatedAt int64 `json:"created_at"`
26 ExpiresAt int64 `json:"expires_at"`
27 UsedBy *string `json:"used_by"`
28 UsedAt *int64 `json:"used_at"`
29 RevokedAt *int64 `json:"revoked_at"`
30}
31
32func (d documentV1) sorted() documentV1 {
33 d.Users = sortedRows(d.Users, userV3Key)
34 d.Groups = sortedRows(d.Groups, groupKey)
35 d.Memberships = sortedRows(d.Memberships, membershipKey)
36 d.GoogleLinks = sortedRows(d.GoogleLinks, googleLinkV3Key)
37 d.Invitations = sortedRows(d.Invitations, func(i invitationV1) (string, string) { return i.ID, "" })
38 return d
39}
40
41func (d documentV1) upgrade() documentV3 {
42 doc := documentV3{
43 ExportedAt: d.ExportedAt,
44 NextUIDNumber: d.NextUIDNumber,
45 NextGIDNumber: d.NextGIDNumber,
46 Users: d.Users,
47 Groups: d.Groups,
48 Memberships: d.Memberships,
49 GoogleLinks: d.GoogleLinks,
50 DexKeys: d.DexKeys,
51 }
52 for _, i := range d.Invitations {
53 doc.Invitations = append(doc.Invitations, invitationV3{ID: i.ID, TokenHash: i.TokenHash, Email: i.Email, CreatedBy: i.CreatedBy, CreatedAt: i.CreatedAt, ExpiresAt: i.ExpiresAt, UsedBy: i.UsedBy, UsedAt: i.UsedAt, RevokedAt: i.RevokedAt})
54 }
55 return doc
56}
57
58func decodeV1(data []byte) (Document, error) {
59 var doc documentV1
60 return decodeLegacy(data, 1, &doc, func() any { return doc.sorted() }, func() json.RawMessage { return doc.DexKeys }, func() document { return doc.upgrade().withoutAddresses() })
61}