69 lines
1.4 KiB
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,
|
|
})
|
|
})
|
|
}
|