mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
144 lines
3.9 KiB
Go
144 lines
3.9 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
user_model "github.com/hanzoai/git/models/user"
|
|
"github.com/hanzoai/git/modules/setting"
|
|
api "github.com/hanzoai/git/modules/structs"
|
|
"github.com/hanzoai/git/modules/web"
|
|
"github.com/hanzoai/git/services/context"
|
|
"github.com/hanzoai/git/services/convert"
|
|
user_service "github.com/hanzoai/git/services/user"
|
|
)
|
|
|
|
// ListEmails list all of the authenticated user's email addresses
|
|
// see https://github.com/gogits/go-gogs-client/wiki/Users-Emails#list-email-addresses-for-a-user
|
|
func ListEmails(ctx *context.APIContext) {
|
|
// swagger:operation GET /user/emails user userListEmails
|
|
// ---
|
|
// summary: List the authenticated user's email addresses
|
|
// produces:
|
|
// - application/json
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/EmailList"
|
|
|
|
emails, err := user_model.GetEmailAddresses(ctx, ctx.Doer.ID)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
apiEmails := make([]*api.Email, len(emails))
|
|
for i := range emails {
|
|
apiEmails[i] = convert.ToEmail(emails[i])
|
|
}
|
|
ctx.JSON(http.StatusOK, &apiEmails)
|
|
}
|
|
|
|
// AddEmail add an email address
|
|
func AddEmail(ctx *context.APIContext) {
|
|
// swagger:operation POST /user/emails user userAddEmail
|
|
// ---
|
|
// summary: Add email addresses
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: body
|
|
// in: body
|
|
// schema:
|
|
// "$ref": "#/definitions/CreateEmailOption"
|
|
// responses:
|
|
// '201':
|
|
// "$ref": "#/responses/EmailList"
|
|
// "422":
|
|
// "$ref": "#/responses/validationError"
|
|
|
|
if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureManageCredentials) {
|
|
ctx.APIErrorNotFound("emails are not allowed to be changed")
|
|
return
|
|
}
|
|
|
|
form := web.GetForm(ctx).(*api.CreateEmailOption)
|
|
if len(form.Emails) == 0 {
|
|
ctx.APIError(http.StatusUnprocessableEntity, "Email list empty")
|
|
return
|
|
}
|
|
|
|
if err := user_service.AddEmailAddresses(ctx, ctx.Doer, form.Emails); err != nil {
|
|
if user_model.IsErrEmailAlreadyUsed(err) {
|
|
ctx.APIError(http.StatusUnprocessableEntity, "Email address has been used: "+err.(user_model.ErrEmailAlreadyUsed).Email)
|
|
} else if user_model.IsErrEmailCharIsNotSupported(err) || user_model.IsErrEmailInvalid(err) {
|
|
email := ""
|
|
if typedError, ok := err.(user_model.ErrEmailInvalid); ok {
|
|
email = typedError.Email
|
|
}
|
|
if typedError, ok := err.(user_model.ErrEmailCharIsNotSupported); ok {
|
|
email = typedError.Email
|
|
}
|
|
|
|
errMsg := fmt.Sprintf("Email address %q invalid", email)
|
|
ctx.APIError(http.StatusUnprocessableEntity, errMsg)
|
|
} else {
|
|
ctx.APIErrorInternal(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
emails, err := user_model.GetEmailAddresses(ctx, ctx.Doer.ID)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
|
|
apiEmails := make([]*api.Email, 0, len(emails))
|
|
for _, email := range emails {
|
|
apiEmails = append(apiEmails, convert.ToEmail(email))
|
|
}
|
|
ctx.JSON(http.StatusCreated, apiEmails)
|
|
}
|
|
|
|
// DeleteEmail delete email
|
|
func DeleteEmail(ctx *context.APIContext) {
|
|
// swagger:operation DELETE /user/emails user userDeleteEmail
|
|
// ---
|
|
// summary: Delete email addresses
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: body
|
|
// in: body
|
|
// schema:
|
|
// "$ref": "#/definitions/DeleteEmailOption"
|
|
// responses:
|
|
// "204":
|
|
// "$ref": "#/responses/empty"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
|
|
if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureManageCredentials) {
|
|
ctx.APIErrorNotFound("emails are not allowed to be changed")
|
|
return
|
|
}
|
|
|
|
form := web.GetForm(ctx).(*api.DeleteEmailOption)
|
|
if len(form.Emails) == 0 {
|
|
ctx.Status(http.StatusNoContent)
|
|
return
|
|
}
|
|
|
|
if err := user_service.DeleteEmailAddresses(ctx, ctx.Doer, form.Emails); err != nil {
|
|
if user_model.IsErrEmailAddressNotExist(err) {
|
|
ctx.APIError(http.StatusNotFound, err.Error())
|
|
} else {
|
|
ctx.APIErrorInternal(err)
|
|
}
|
|
return
|
|
}
|
|
ctx.Status(http.StatusNoContent)
|
|
}
|