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}