package auth import ( "context" "encoding/json" "net/http" "pipu/api/internal/api/gen" ) func (h *Handler) ExportUsers(ctx context.Context, _ gen.ExportUsersRequestObject) (gen.ExportUsersResponseObject, error) { p, err := principal(ctx) if err != nil { return nil, err } users, err := h.svc.ExportUsers(ctx, p) if err != nil { return nil, err } archive := gen.UserArchive{Version: 1, Users: make([]gen.UserArchiveEntry, 0, len(users))} for _, u := range users { archive.Users = append(archive.Users, gen.UserArchiveEntry{ Username: u.Username, DisplayName: u.DisplayName, PasswordHash: u.PasswordHash, Role: gen.Role(u.Role), IsBlocked: u.IsBlocked, MustChangePassword: u.MustChangePassword, MustChangeCredentials: u.MustChangeCredentials, ReviewsUploads: u.ReviewsUploads, ManagesUpdates: u.ManagesUpdates, }) } return archiveResponse{archive}, nil } type archiveResponse struct{ gen.UserArchive } func (r archiveResponse) VisitExportUsersResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Disposition", `attachment; filename="pipu-users.json"`) w.Header().Set("Cache-Control", "no-store") return json.NewEncoder(w).Encode(r.UserArchive) } func (h *Handler) ImportUsers(ctx context.Context, req gen.ImportUsersRequestObject) (gen.ImportUsersResponseObject, error) { p, err := principal(ctx) if err != nil { return nil, err } if req.Body == nil { return nil, archiveInvalid() } entries := make([]ArchivedUser, 0, len(req.Body.Users)) for _, u := range req.Body.Users { entries = append(entries, ArchivedUser{ Username: u.Username, DisplayName: u.DisplayName, PasswordHash: u.PasswordHash, Role: Role(u.Role), IsBlocked: u.IsBlocked, MustChangePassword: u.MustChangePassword, MustChangeCredentials: u.MustChangeCredentials, ReviewsUploads: u.ReviewsUploads, ManagesUpdates: u.ManagesUpdates, }) } created, skipped, err := h.svc.ImportUsers(ctx, p, int(req.Body.Version), entries) if err != nil { return nil, err } return gen.ImportUsers200JSONResponse{Created: created, Skipped: skipped}, nil }