Raw
 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}