diff --git a/internal/http/encoder.go b/internal/http/encoder.go index 9efef21..626d4ff 100644 --- a/internal/http/encoder.go +++ b/internal/http/encoder.go @@ -6,7 +6,11 @@ import ( "net/http" ) -type encoder struct { +type encoder struct{} + +type errorResponse struct { + Message string `json:"message"` + Status int `json:"status"` } func (e encoder) StatusResponse(ctx context.Context, w http.ResponseWriter, response interface{}, status int) { @@ -14,14 +18,19 @@ func (e encoder) StatusResponse(ctx context.Context, w http.ResponseWriter, resp w.Header().Set("Content-Type", "application/json; charset=utf=8") w.WriteHeader(status) if err := json.NewEncoder(w).Encode(response); err != nil { - // log err + w.WriteHeader(http.StatusInternalServerError) + return } } else { w.WriteHeader(status) } } -func (e encoder) StatusNoContent(w http.ResponseWriter) { +func (e encoder) StatusCreated(w http.ResponseWriter) { + w.WriteHeader(http.StatusCreated) +} + +func (e encoder) NoContent(w http.ResponseWriter) { w.WriteHeader(http.StatusNoContent) } @@ -32,3 +41,13 @@ func (e encoder) StatusNotFound(ctx context.Context, w http.ResponseWriter) { func (e encoder) StatusInternalError(w http.ResponseWriter) { w.WriteHeader(http.StatusInternalServerError) } + +func (e encoder) Error(w http.ResponseWriter, err error) { + res := errorResponse{ + Message: err.Error(), + } + + w.Header().Set("Content-Type", "application/json; charset=utf=8") + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(res) +} diff --git a/internal/http/irc.go b/internal/http/irc.go index 5e14b25..f657d58 100644 --- a/internal/http/irc.go +++ b/internal/http/irc.go @@ -47,7 +47,7 @@ func (h ircHandler) listNetworks(w http.ResponseWriter, r *http.Request) { networks, err := h.service.GetNetworksWithHealth(ctx) if err != nil { - // + h.encoder.Error(w, err) } h.encoder.StatusResponse(ctx, w, networks, http.StatusOK) @@ -63,30 +63,27 @@ func (h ircHandler) getNetworkByID(w http.ResponseWriter, r *http.Request) { network, err := h.service.GetNetworkByID(int64(id)) if err != nil { - // + h.encoder.Error(w, err) } h.encoder.StatusResponse(ctx, w, network, http.StatusOK) } func (h ircHandler) storeNetwork(w http.ResponseWriter, r *http.Request) { - var ( - ctx = r.Context() - data domain.IrcNetwork - ) + var data domain.IrcNetwork if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + h.encoder.Error(w, err) return } - err := h.service.StoreNetwork(ctx, &data) + err := h.service.StoreNetwork(r.Context(), &data) if err != nil { - // - h.encoder.StatusResponse(ctx, w, nil, http.StatusBadRequest) + h.encoder.Error(w, err) return } - h.encoder.StatusResponse(ctx, w, nil, http.StatusCreated) + h.encoder.NoContent(w) } func (h ircHandler) updateNetwork(w http.ResponseWriter, r *http.Request) { @@ -96,22 +93,21 @@ func (h ircHandler) updateNetwork(w http.ResponseWriter, r *http.Request) { ) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + h.encoder.Error(w, err) return } err := h.service.UpdateNetwork(ctx, &data) if err != nil { - // - h.encoder.StatusResponse(ctx, w, nil, http.StatusBadRequest) + h.encoder.Error(w, err) return } - h.encoder.StatusResponse(ctx, w, nil, http.StatusCreated) + h.encoder.NoContent(w) } func (h ircHandler) storeChannel(w http.ResponseWriter, r *http.Request) { var ( - ctx = r.Context() data domain.IrcChannel networkID = chi.URLParam(r, "networkID") ) @@ -119,15 +115,17 @@ func (h ircHandler) storeChannel(w http.ResponseWriter, r *http.Request) { id, _ := strconv.Atoi(networkID) if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + h.encoder.Error(w, err) return } err := h.service.StoreChannel(int64(id), &data) if err != nil { - // + h.encoder.Error(w, err) + return } - h.encoder.StatusResponse(ctx, w, nil, http.StatusCreated) + h.encoder.NoContent(w) } func (h ircHandler) deleteNetwork(w http.ResponseWriter, r *http.Request) { @@ -140,8 +138,9 @@ func (h ircHandler) deleteNetwork(w http.ResponseWriter, r *http.Request) { err := h.service.DeleteNetwork(ctx, int64(id)) if err != nil { - // + h.encoder.Error(w, err) + return } - h.encoder.StatusResponse(ctx, w, nil, http.StatusNoContent) + h.encoder.NoContent(w) } diff --git a/internal/http/release.go b/internal/http/release.go index 472225f..0ea8033 100644 --- a/internal/http/release.go +++ b/internal/http/release.go @@ -145,5 +145,5 @@ func (h releaseHandler) deleteReleases(w http.ResponseWriter, r *http.Request) { return } - h.encoder.StatusNoContent(w) + h.encoder.NoContent(w) } diff --git a/web/src/api/APIClient.ts b/web/src/api/APIClient.ts index 6198260..f4ea14e 100644 --- a/web/src/api/APIClient.ts +++ b/web/src/api/APIClient.ts @@ -89,7 +89,7 @@ export const APIClient = { }, irc: { getNetworks: () => appClient.Get("api/irc"), - createNetwork: (network: IrcNetwork) => appClient.Post("api/irc", network), + createNetwork: (network: IrcNetworkCreate) => appClient.Post("api/irc", network), updateNetwork: (network: IrcNetwork) => appClient.Put(`api/irc/network/${network.id}`, network), deleteNetwork: (id: number) => appClient.Delete(`api/irc/network/${id}`), }, diff --git a/web/src/forms/settings/IndexerForms.tsx b/web/src/forms/settings/IndexerForms.tsx index a89c618..072d4ef 100644 --- a/web/src/forms/settings/IndexerForms.tsx +++ b/web/src/forms/settings/IndexerForms.tsx @@ -148,7 +148,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) { }) const ircMutation = useMutation( - (network: IrcNetwork) => APIClient.irc.createNetwork(network) + (network: IrcNetworkCreate) => APIClient.irc.createNetwork(network) ); const onSubmit = (formData: any) => { @@ -170,13 +170,11 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) { }); } - const network: IrcNetwork = { - id: 0, + const network: IrcNetworkCreate = { name: ind.irc.network, pass: "", enabled: false, connected: false, - connected_since: 0, server: ind.irc.server, port: ind.irc.port, tls: ind.irc.tls, diff --git a/web/src/types/Irc.d.ts b/web/src/types/Irc.d.ts index 4f9e7a0..cd59d49 100644 --- a/web/src/types/Irc.d.ts +++ b/web/src/types/Irc.d.ts @@ -13,6 +13,19 @@ interface IrcNetwork { connected_since: Time; } +interface IrcNetworkCreate { + name: string; + enabled: boolean; + server: string; + port: number; + tls: boolean; + pass: string; + invite_command: string; + nickserv?: NickServ; // optional + channels: IrcChannel[]; + connected: boolean; +} + interface IrcChannel { id: number; enabled: boolean;