chore(go): move a couple more handlers to use generated types. For #3778

This commit is contained in:
Gabe Kangas
2025-01-18 16:24:35 -08:00
parent 6abbf8f50c
commit b3947ef7ea
2 changed files with 61 additions and 51 deletions

View File

@@ -110,18 +110,13 @@ func GetIPAddressBans(w http.ResponseWriter, r *http.Request) {
// UpdateUserEnabled enable or disable a single user by ID. // UpdateUserEnabled enable or disable a single user by ID.
func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) { func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
type blockUserRequest struct {
UserID string `json:"userId"`
Enabled bool `json:"enabled"`
}
if r.Method != http.MethodPost { if r.Method != http.MethodPost {
webutils.WriteSimpleResponse(w, false, r.Method+" not supported") webutils.WriteSimpleResponse(w, false, r.Method+" not supported")
return return
} }
decoder := json.NewDecoder(r.Body) decoder := json.NewDecoder(r.Body)
var request blockUserRequest var request generated.UpdateUserEnabledJSONBody
if err := decoder.Decode(&request); err != nil { if err := decoder.Decode(&request); err != nil {
log.Errorln(err) log.Errorln(err)
@@ -129,54 +124,62 @@ func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
return return
} }
if request.UserID == "" { if request.UserId == nil || *request.UserId == "" || request.Enabled == nil {
webutils.WriteSimpleResponse(w, false, "must provide userId") webutils.WriteSimpleResponse(w, false, "must provide userId and enabled state")
return return
} }
if err := updateUserStatus(request); err != nil {
webutils.WriteSimpleResponse(w, false, err.Error())
return
}
if !*request.Enabled {
if err := handleUserDisabling(*request.UserId); err != nil {
webutils.WriteSimpleResponse(w, false, err.Error())
return
}
}
webutils.WriteSimpleResponse(w, true, fmt.Sprintf("%s enabled: %t", *request.UserId, *request.Enabled))
}
func updateUserStatus(request generated.UpdateUserEnabledJSONBody) error {
userRepository := userrepository.Get() userRepository := userrepository.Get()
if err := userRepository.SetEnabled(*request.UserId, *request.Enabled); err != nil {
// Disable/enable the user
if err := userRepository.SetEnabled(request.UserID, request.Enabled); err != nil {
log.Errorln("error changing user enabled status", err) log.Errorln("error changing user enabled status", err)
webutils.WriteSimpleResponse(w, false, err.Error()) return err
return
} }
// Hide/show the user's chat messages if disabling. if !*request.Enabled {
// Leave hidden messages hidden to be safe. if err := chat.SetMessageVisibilityForUserID(*request.UserId, *request.Enabled); err != nil {
if !request.Enabled {
if err := chat.SetMessageVisibilityForUserID(request.UserID, request.Enabled); err != nil {
log.Errorln("error changing user messages visibility", err) log.Errorln("error changing user messages visibility", err)
webutils.WriteSimpleResponse(w, false, err.Error()) return err
return
} }
} }
return nil
}
// Forcefully disconnect the user from the chat func handleUserDisabling(userID string) error {
if !request.Enabled { clients, err := chat.GetClientsForUser(userID)
clients, err := chat.GetClientsForUser(request.UserID)
if len(clients) == 0 { if len(clients) == 0 {
// Nothing to do return nil
return
} }
if err != nil { if err != nil {
log.Errorln("error fetching clients for user: ", err) log.Errorln("error fetching clients for user: ", err)
webutils.WriteSimpleResponse(w, false, err.Error()) return err
return
} }
chat.DisconnectClients(clients) chat.DisconnectClients(clients)
disconnectedUser := userRepository.GetUserByID(request.UserID) userRepository := userrepository.Get()
disconnectedUser := userRepository.GetUserByID(userID)
_ = chat.SendSystemAction(fmt.Sprintf("**%s** has been removed from chat.", disconnectedUser.DisplayName), true) _ = chat.SendSystemAction(fmt.Sprintf("**%s** has been removed from chat.", disconnectedUser.DisplayName), true)
localIP4Address := "127.0.0.1" localIP4Address := "127.0.0.1"
localIP6Address := "::1" localIP6Address := "::1"
// Ban this user's IP address.
authRepository := authrepository.Get() authRepository := authrepository.Get()
for _, client := range clients { for _, client := range clients {
ipAddress := client.IPAddress ipAddress := client.IPAddress
if ipAddress != localIP4Address && ipAddress != localIP6Address { if ipAddress != localIP4Address && ipAddress != localIP6Address {
@@ -186,9 +189,7 @@ func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
} }
} }
} }
} return nil
webutils.WriteSimpleResponse(w, true, fmt.Sprintf("%s enabled: %t", request.UserID, request.Enabled))
} }
// GetDisabledUsers will return all the disabled users. // GetDisabledUsers will return all the disabled users.
@@ -282,13 +283,19 @@ func SendSystemMessageToConnectedClient(integration models.ExternalAPIUser, w ht
return return
} }
var message events.SystemMessageEvent // var message events.SystemMessageEvent
var message generated.SendSystemMessageJSONRequestBody
if err := json.NewDecoder(r.Body).Decode(&message); err != nil { if err := json.NewDecoder(r.Body).Decode(&message); err != nil {
webutils.InternalErrorHandler(w, err) webutils.InternalErrorHandler(w, err)
return return
} }
chat.SendSystemMessageToClient(uint(clientIDNumeric), message.Body) if message.Body == nil {
webutils.WriteSimpleResponse(w, false, "no message body provided")
return
}
chat.SendSystemMessageToClient(uint(clientIDNumeric), *message.Body)
webutils.WriteSimpleResponse(w, true, "sent") webutils.WriteSimpleResponse(w, true, "sent")
} }

View File

@@ -11,6 +11,7 @@ import (
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/userrepository" "github.com/owncast/owncast/persistence/userrepository"
"github.com/owncast/owncast/webserver/handlers/generated"
webutils "github.com/owncast/owncast/webserver/utils" webutils "github.com/owncast/owncast/webserver/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -51,18 +52,20 @@ func RegisterFediverseOTPRequest(u models.User, w http.ResponseWriter, r *http.R
// VerifyFediverseOTPRequest verifies the given OTP code for the given access token. // VerifyFediverseOTPRequest verifies the given OTP code for the given access token.
func VerifyFediverseOTPRequest(w http.ResponseWriter, r *http.Request) { func VerifyFediverseOTPRequest(w http.ResponseWriter, r *http.Request) {
type request struct { var req generated.VerifyFediverseOTPRequestJSONBody
Code string `json:"code"`
if req.Code == nil {
webutils.WriteSimpleResponse(w, false, "Could not decode request: code is required")
return
} }
var req request
decoder := json.NewDecoder(r.Body) decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&req); err != nil { if err := decoder.Decode(&req); err != nil {
webutils.WriteSimpleResponse(w, false, "Could not decode request: "+err.Error()) webutils.WriteSimpleResponse(w, false, "Could not decode request: "+err.Error())
return return
} }
accessToken := r.URL.Query().Get("accessToken") accessToken := r.URL.Query().Get("accessToken")
valid, authRegistration := fediverseauth.ValidateFediverseOTP(accessToken, req.Code) valid, authRegistration := fediverseauth.ValidateFediverseOTP(accessToken, *req.Code)
if !valid { if !valid {
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
return return