website/pkg/controller/api/username_check.go

69 lines
1.4 KiB
Go

package api
import (
"fmt"
"net/http"
"strings"
"code.nonshy.com/nonshy/website/pkg/config"
"code.nonshy.com/nonshy/website/pkg/models"
)
// UsernameCheck API.
func UsernameCheck() http.HandlerFunc {
// Request JSON schema.
type Request struct {
Username string `json:"username"`
}
// Response JSON schema.
type Response struct {
OK bool `json:"OK"`
Error string `json:"error,omitempty"`
}
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
SendJSON(w, http.StatusNotAcceptable, Response{
Error: "POST method only",
})
return
}
// Parse request payload.
var req Request
if err := ParseJSON(r, &req); err != nil {
SendJSON(w, http.StatusBadRequest, Response{
Error: fmt.Sprintf("Error with request payload: %s", err),
})
return
}
// Username to test.
var username = strings.TrimSpace(strings.ToLower(req.Username))
// Does it exist?
if _, err := models.FindUser(username); err == nil {
SendJSON(w, http.StatusOK, Response{
Error: "That username is already taken, please try another one.",
})
return
}
// Is it reserved?
for _, cmp := range config.ReservedUsernames {
if username == cmp {
SendJSON(w, http.StatusOK, Response{
Error: "That username is reserved, please choose a different username.",
})
return
}
}
// Send success response.
SendJSON(w, http.StatusOK, Response{
OK: true,
})
})
}