package userbase import ( "encoding/json" ) type documentV2 struct { ExportVersion int `json:"export_version"` ExportedAt int64 `json:"exported_at"` NextUIDNumber int64 `json:"next_uid_number"` NextGIDNumber int64 `json:"next_gid_number"` Users []userV3 `json:"users"` Groups []group `json:"groups"` Memberships []membership `json:"memberships"` GoogleLinks []googleLinkV3 `json:"google_links"` Invitations []invitationV3 `json:"invitations"` InvitationGroups []invitationGroup `json:"invitation_groups"` PendingConfirmations []pendingConfirmation `json:"pending_confirmations"` DexKeys json.RawMessage `json:"dex_keys,omitempty"` } func (d documentV2) sorted() documentV2 { d.Users = sortedRows(d.Users, userV3Key) d.Groups = sortedRows(d.Groups, groupKey) d.Memberships = sortedRows(d.Memberships, membershipKey) d.GoogleLinks = sortedRows(d.GoogleLinks, googleLinkV3Key) d.Invitations = sortedRows(d.Invitations, invitationV3Key) d.InvitationGroups = sortedRows(d.InvitationGroups, invitationGroupKey) d.PendingConfirmations = sortedRows(d.PendingConfirmations, pendingKey) return d } func (d documentV2) upgrade() documentV3 { return documentV3{ ExportedAt: d.ExportedAt, NextUIDNumber: d.NextUIDNumber, NextGIDNumber: d.NextGIDNumber, Users: d.Users, Groups: d.Groups, Memberships: d.Memberships, GoogleLinks: d.GoogleLinks, Invitations: d.Invitations, InvitationGroups: d.InvitationGroups, PendingConfirmations: d.PendingConfirmations, DexKeys: d.DexKeys, } } func decodeV2(data []byte) (Document, error) { var doc documentV2 return decodeLegacy(data, 2, &doc, func() any { return doc.sorted() }, func() json.RawMessage { return doc.DexKeys }, func() document { return doc.upgrade().withoutAddresses() }) }