feat(handlers/resource): use slogger #9

merged
opened by brookjeynes.dev targeting master from push-trrpxxyxxmot
Changed files
+31 -26
internal
server
handlers
+31 -26
internal/server/handlers/resource.go
···
import (
"errors"
"fmt"
-
"log"
"net/http"
"time"
···
}
func (h *Handler) HandleNewResourcePage(w http.ResponseWriter, r *http.Request) {
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
-
log.Println("failed to get logged-in user:", err)
htmx.HxRedirect(w, "/login")
return
}
···
case http.MethodPost:
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
htmx.HxRedirect(w, "/login")
return
}
newResource, err := parseResourceForm(r)
if err != nil {
-
log.Println("invalid resource form:", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to create resource, ensure all fields contain valid data.")
return
}
···
newResource.CreatedAt = time.Now().UTC()
if err := db.ValidateResource(newResource); err != nil {
-
log.Println("invalid resource definition:", err)
switch {
case errors.Is(err, db.ErrResourceTitleEmpty):
htmx.HxError(w, http.StatusBadRequest, "Resource must have a title.")
···
if newResource.Link != nil {
linkCheckResult := google.CheckResourceLinkSafety(*newResource.Link)
if linkCheckResult.Err != nil {
-
log.Println("invalid resource definition:", linkCheckResult.Err)
switch {
case errors.Is(linkCheckResult.Err, google.ErrResourceLinkSketchy):
if !h.Config.Core.Dev {
···
},
})
if err != nil {
-
log.Println("failed to create resource record:", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to create resource, try again later.")
return
}
err = SavePendingCreate(h, w, r, PendingResourceCreation, newResource)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending resource creation: %v", err)
}
if !h.Config.Core.Dev {
···
Set("link_provided", newResource.Link != nil),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
}
}
···
}
func (h *Handler) HandleDeleteResource(w http.ResponseWriter, r *http.Request) {
user := h.Oauth.GetUser(r)
if user == nil {
-
log.Println("failed to get logged-in user")
htmx.HxRedirect(w, "/login")
return
}
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
htmx.HxError(w, http.StatusUnauthorized, "Failed to delete resource, try again later.")
return
}
···
rkey := chi.URLParam(r, "rkey")
resource, err := db.GetResourceByRkey(h.Db, user.Did, rkey)
if err != nil {
-
log.Println("failed to get resource from db:", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete resource, try again later.")
return
}
if user.Did != resource.Did {
-
log.Printf("user '%s' does not own record '%s'", user.Did, rkey)
htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to delete this resource.")
return
}
···
Rkey: resource.Rkey,
})
if err != nil {
-
log.Println("failed to delete resource from PDS:", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete resource, try again later.")
return
}
err = SavePendingDelete(h, w, r, PendingResourceDeletion, resource)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending resource deletion: %v", err)
}
if !h.Config.Core.Dev {
···
Set("resource_type", resource.Type),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
}
}
···
}
func (h *Handler) HandleEditResourcePage(w http.ResponseWriter, r *http.Request) {
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
-
log.Println("failed to get logged-in user:", err)
htmx.HxRedirect(w, "/login")
return
}
···
rkey := chi.URLParam(r, "rkey")
resource, err := db.GetResourceByRkey(h.Db, user.Did, rkey)
if err != nil {
-
log.Println("failed to get resource from db:", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update resource, try again later.")
return
}
if user.Did != resource.Did {
-
log.Printf("user '%s' does not own record '%s'", user.Did, rkey)
htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to edit this resource.")
return
}
···
case http.MethodPost:
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
htmx.HxRedirect(w, "/login")
return
}
updatedResource, err := parseResourceForm(r)
if err != nil {
-
log.Println("invalid resource form:", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to create resource, ensure all fields contain valid data.")
return
}
···
updatedResource.CreatedAt = resource.CreatedAt
if err := db.ValidateResource(updatedResource); err != nil {
-
log.Println("invalid resource definition:", err)
switch {
case errors.Is(err, db.ErrResourceTitleEmpty):
htmx.HxError(w, http.StatusBadRequest, "Resource must have a title.")
···
if updatedResource.Link != nil && (resource.Link == nil || *updatedResource.Link != *resource.Link) {
linkCheckResult := google.CheckResourceLinkSafety(*updatedResource.Link)
if linkCheckResult.Err != nil {
-
log.Println("invalid resource definition:", linkCheckResult.Err)
switch {
case errors.Is(linkCheckResult.Err, google.ErrResourceLinkSketchy):
if !h.Config.Core.Dev {
···
SwapRecord: cid,
})
if err != nil {
-
log.Println("failed to update resource record:", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update resource, try again later.")
return
}
err = SavePendingUpdate(h, w, r, PendingResourceUpdates, updatedResource)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending resource updates: %v", err)
}
if !h.Config.Core.Dev {
···
Set("link_provided", updatedResource.Link != nil),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
}
}
···
import (
"errors"
"fmt"
"net/http"
"time"
···
}
func (h *Handler) HandleNewResourcePage(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleNewResourcePage")
+
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
+
l.Error("failed to get logged-in user", "err", err)
htmx.HxRedirect(w, "/login")
return
}
···
case http.MethodPost:
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
+
l.Error("failed to get authorized client", "err", err)
htmx.HxRedirect(w, "/login")
return
}
newResource, err := parseResourceForm(r)
if err != nil {
+
l.Error("invalid resource form", "err", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to create resource, ensure all fields contain valid data.")
return
}
···
newResource.CreatedAt = time.Now().UTC()
if err := db.ValidateResource(newResource); err != nil {
+
l.Error("invalid resource definition", "err", err)
switch {
case errors.Is(err, db.ErrResourceTitleEmpty):
htmx.HxError(w, http.StatusBadRequest, "Resource must have a title.")
···
if newResource.Link != nil {
linkCheckResult := google.CheckResourceLinkSafety(*newResource.Link)
if linkCheckResult.Err != nil {
+
l.Error("invalid resource definition", "err", linkCheckResult.Err)
switch {
case errors.Is(linkCheckResult.Err, google.ErrResourceLinkSketchy):
if !h.Config.Core.Dev {
···
},
})
if err != nil {
+
l.Error("failed to create resource record", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to create resource, try again later.")
return
}
err = SavePendingCreate(h, w, r, PendingResourceCreation, newResource)
if err != nil {
+
l.Error("failed to save yoten-session to add pending resource creation", "err", err)
}
if !h.Config.Core.Dev {
···
Set("link_provided", newResource.Link != nil),
})
if err != nil {
+
l.Error("failed to enqueue posthog event", "err", err)
}
}
···
}
func (h *Handler) HandleDeleteResource(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleDeleteResource")
+
user := h.Oauth.GetUser(r)
if user == nil {
+
l.Error("failed to get logged-in user")
htmx.HxRedirect(w, "/login")
return
}
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
+
l.Error("failed to get authorized client", "err", err)
htmx.HxError(w, http.StatusUnauthorized, "Failed to delete resource, try again later.")
return
}
···
rkey := chi.URLParam(r, "rkey")
resource, err := db.GetResourceByRkey(h.Db, user.Did, rkey)
if err != nil {
+
l.Error("failed to get resource from db", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete resource, try again later.")
return
}
if user.Did != resource.Did {
+
l.Error("user does not own record", "did", user.Did, "resourceDid", resource.Did)
htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to delete this resource.")
return
}
···
Rkey: resource.Rkey,
})
if err != nil {
+
l.Error("failed to delete resource from PDS", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete resource, try again later.")
return
}
err = SavePendingDelete(h, w, r, PendingResourceDeletion, resource)
if err != nil {
+
l.Error("failed to save yoten-session to add pending resource deletion", "err", err)
}
if !h.Config.Core.Dev {
···
Set("resource_type", resource.Type),
})
if err != nil {
+
l.Error("failed to enqueue posthog event", "err", err)
}
}
···
}
func (h *Handler) HandleEditResourcePage(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleEditResourcePage")
+
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
+
l.Error("failed to get logged-in user", "err", err)
htmx.HxRedirect(w, "/login")
return
}
···
rkey := chi.URLParam(r, "rkey")
resource, err := db.GetResourceByRkey(h.Db, user.Did, rkey)
if err != nil {
+
l.Error("failed to get resource from db", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update resource, try again later.")
return
}
if user.Did != resource.Did {
+
l.Error("user does not own record", "did", user.Did, "resourceDid", resource.Did)
htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to edit this resource.")
return
}
···
case http.MethodPost:
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
+
l.Error("failed to get authorized client", "err", err)
htmx.HxRedirect(w, "/login")
return
}
updatedResource, err := parseResourceForm(r)
if err != nil {
+
l.Error("invalid resource form", "err", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to create resource, ensure all fields contain valid data.")
return
}
···
updatedResource.CreatedAt = resource.CreatedAt
if err := db.ValidateResource(updatedResource); err != nil {
+
l.Error("invalid resource definition", "err", err)
switch {
case errors.Is(err, db.ErrResourceTitleEmpty):
htmx.HxError(w, http.StatusBadRequest, "Resource must have a title.")
···
if updatedResource.Link != nil && (resource.Link == nil || *updatedResource.Link != *resource.Link) {
linkCheckResult := google.CheckResourceLinkSafety(*updatedResource.Link)
if linkCheckResult.Err != nil {
+
l.Error("invalid resource link", "link", resource.Link, "threatType", linkCheckResult.ThreatType, "err", linkCheckResult.Err)
switch {
case errors.Is(linkCheckResult.Err, google.ErrResourceLinkSketchy):
if !h.Config.Core.Dev {
···
SwapRecord: cid,
})
if err != nil {
+
l.Error("failed to update resource record", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update resource, try again later.")
return
}
err = SavePendingUpdate(h, w, r, PendingResourceUpdates, updatedResource)
if err != nil {
+
l.Error("failed to save yoten-session to add pending resource updates", "err", err)
}
if !h.Config.Core.Dev {
···
Set("link_provided", updatedResource.Link != nil),
})
if err != nil {
+
l.Error("failed to enqueue posthog event", "err", err)
}
}