package userbase import ( "encoding/json" ) type documentV1 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 []invitationV1 `json:"invitations"` DexKeys json.RawMessage `json:"dex_keys,omitempty"` } type invitationV1 struct { ID string `json:"id"` TokenHash []byte `json:"token_hash"` Email *string `json:"email"` CreatedBy *string `json:"created_by"` CreatedAt int64 `json:"created_at"` ExpiresAt int64 `json:"expires_at"` UsedBy *string `json:"used_by"` UsedAt *int64 `json:"used_at"` RevokedAt *int64 `json:"revoked_at"` } func (d documentV1) sorted() documentV1 { 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, func(i invitationV1) (string, string) { return i.ID, "" }) return d } func (d documentV1) upgrade() documentV3 { doc := documentV3{ ExportedAt: d.ExportedAt, NextUIDNumber: d.NextUIDNumber, NextGIDNumber: d.NextGIDNumber, Users: d.Users, Groups: d.Groups, Memberships: d.Memberships, GoogleLinks: d.GoogleLinks, DexKeys: d.DexKeys, } for _, i := range d.Invitations { 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}) } return doc } func decodeV1(data []byte) (Document, error) { var doc documentV1 return decodeLegacy(data, 1, &doc, func() any { return doc.sorted() }, func() json.RawMessage { return doc.DexKeys }, func() document { return doc.upgrade().withoutAddresses() }) }