Raw
 1package userbase
 2
 3import (
 4	"encoding/json"
 5)
 6
 7type documentV2 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          []invitationV3        `json:"invitations"`
17	InvitationGroups     []invitationGroup     `json:"invitation_groups"`
18	PendingConfirmations []pendingConfirmation `json:"pending_confirmations"`
19	DexKeys              json.RawMessage       `json:"dex_keys,omitempty"`
20}
21
22func (d documentV2) sorted() documentV2 {
23	d.Users = sortedRows(d.Users, userV3Key)
24	d.Groups = sortedRows(d.Groups, groupKey)
25	d.Memberships = sortedRows(d.Memberships, membershipKey)
26	d.GoogleLinks = sortedRows(d.GoogleLinks, googleLinkV3Key)
27	d.Invitations = sortedRows(d.Invitations, invitationV3Key)
28	d.InvitationGroups = sortedRows(d.InvitationGroups, invitationGroupKey)
29	d.PendingConfirmations = sortedRows(d.PendingConfirmations, pendingKey)
30	return d
31}
32
33func (d documentV2) upgrade() documentV3 {
34	return documentV3{
35		ExportedAt:           d.ExportedAt,
36		NextUIDNumber:        d.NextUIDNumber,
37		NextGIDNumber:        d.NextGIDNumber,
38		Users:                d.Users,
39		Groups:               d.Groups,
40		Memberships:          d.Memberships,
41		GoogleLinks:          d.GoogleLinks,
42		Invitations:          d.Invitations,
43		InvitationGroups:     d.InvitationGroups,
44		PendingConfirmations: d.PendingConfirmations,
45		DexKeys:              d.DexKeys,
46	}
47}
48
49func decodeV2(data []byte) (Document, error) {
50	var doc documentV2
51	return decodeLegacy(data, 2, &doc, func() any { return doc.sorted() }, func() json.RawMessage { return doc.DexKeys }, func() document { return doc.upgrade().withoutAddresses() })
52}