device: updating values now return rows

This commit is contained in:
Tigor Hutasuhut 2024-04-30 11:34:30 +07:00
parent e5b1d4aa9d
commit 0073306563
6 changed files with 26 additions and 15 deletions

View file

@ -9,20 +9,26 @@ import (
"github.com/tigorlazuardi/redmage/pkg/errs" "github.com/tigorlazuardi/redmage/pkg/errs"
) )
func (api *API) DevicesUpdate(ctx context.Context, id int, update *models.DeviceSetter) (err error) { func (api *API) DevicesUpdate(ctx context.Context, id int, update *models.DeviceSetter) (device *models.Device, err error) {
ctx, span := tracer.Start(ctx, "*API.DevicesUpdate") ctx, span := tracer.Start(ctx, "*API.DevicesUpdate")
defer span.End() defer span.End()
err = models.Devices.Update(ctx, api.db, update, &models.Device{ID: int32(id)}) device = &models.Device{ID: int32(id)}
err = models.Devices.Update(ctx, api.db, update, device)
if err != nil { if err != nil {
var sqliteErr sqlite3.Error var sqliteErr sqlite3.Error
if errors.As(err, &sqliteErr) { if errors.As(err, &sqliteErr) {
if sqliteErr.Code == sqlite3.ErrConstraint { if sqliteErr.Code == sqlite3.ErrConstraint {
return errs.Wrapw(err, "a device with the same slug id already exists").Code(409) return device, errs.Wrapw(err, "a device with the same slug id already exists").Code(409)
} }
} }
return errs.Wrapw(err, "failed to update device", "id", id, "values", update) return device, errs.Wrapw(err, "failed to update device", "id", id, "values", update)
} }
return if err := device.Reload(ctx, api.db); err != nil {
return device, errs.Wrapw(err, "failed to reload device", "id", id)
}
return device, nil
} }

View file

@ -1,7 +1,6 @@
POST http://localhost:8080/api/v1/devices HTTP/1.1 POST http://localhost:8080/api/v1/devices HTTP/1.1
Host: localhost:8080 Host: localhost:8080
Content-Type: application/json Content-Type: application/json
Content-Length: 211
{ {
"name": "Laptop", "name": "Laptop",

View file

@ -1,10 +1,7 @@
PATCH http://localhost:8080/api/v1/devices/1 HTTP/1.1 PATCH http://localhost:8080/api/v1/devices/1 HTTP/1.1
Host: localhost:8080 Host: localhost:8080
Content-Type: application/json Content-Type: application/json
Content-Length: 78
{ {
"slug": "laptop", "nsfw": 0
"aspect_ratio_tolerance": 0.2,
"nsfw": 1
} }

View file

@ -3,5 +3,5 @@ Host: localhost:8080
Content-Type: application/json Content-Type: application/json
{ {
"subreddit": "animemidriff" "subreddit": "wallpapers"
} }

View file

@ -31,6 +31,11 @@ func (routes *Routes) APIDeviceUpdate(rw http.ResponseWriter, r *http.Request) {
ctx, span := tracer.Start(r.Context(), "*Routes.APIDeviceUpdate") ctx, span := tracer.Start(r.Context(), "*Routes.APIDeviceUpdate")
defer span.End() defer span.End()
var (
enc = json.NewEncoder(rw)
dec = json.NewDecoder(r.Body)
)
id, err := strconv.Atoi(chi.URLParam(r, "id")) id, err := strconv.Atoi(chi.URLParam(r, "id"))
if err != nil { if err != nil {
log.New(ctx).Err(err).Error("failed to parse id") log.New(ctx).Err(err).Error("failed to parse id")
@ -41,14 +46,14 @@ func (routes *Routes) APIDeviceUpdate(rw http.ResponseWriter, r *http.Request) {
var body deviceUpdate var body deviceUpdate
if err = json.NewDecoder(r.Body).Decode(&body); err != nil { if err = dec.Decode(&body); err != nil {
log.New(ctx).Err(err).Error("failed to decode json body") log.New(ctx).Err(err).Error("failed to decode json body")
rw.WriteHeader(http.StatusBadRequest) rw.WriteHeader(http.StatusBadRequest)
_ = json.NewEncoder(rw).Encode(map[string]string{"error": fmt.Sprintf("cannot decode json body: %s", err)}) _ = json.NewEncoder(rw).Encode(map[string]string{"error": fmt.Sprintf("cannot decode json body: %s", err)})
return return
} }
err = routes.API.DevicesUpdate(ctx, id, &models.DeviceSetter{ device, err := routes.API.DevicesUpdate(ctx, id, &models.DeviceSetter{
Slug: omit.FromCond(body.Slug, body.Slug != ""), Slug: omit.FromCond(body.Slug, body.Slug != ""),
Name: omit.FromCond(body.Name, body.Name != ""), Name: omit.FromCond(body.Name, body.Name != ""),
ResolutionX: omit.FromCond(body.ResolutionX, body.ResolutionX != 0), ResolutionX: omit.FromCond(body.ResolutionX, body.ResolutionX != 0),
@ -63,11 +68,12 @@ func (routes *Routes) APIDeviceUpdate(rw http.ResponseWriter, r *http.Request) {
UpdatedAt: omit.From(time.Now().Unix()), UpdatedAt: omit.From(time.Now().Unix()),
}) })
if err != nil { if err != nil {
log.New(ctx).Err(err).Error("failed to update device")
code, message := errs.HTTPMessage(err) code, message := errs.HTTPMessage(err)
rw.WriteHeader(code) rw.WriteHeader(code)
_ = json.NewEncoder(rw).Encode(map[string]string{"error": message}) _ = enc.Encode(map[string]string{"error": message})
return return
} }
_ = json.NewEncoder(rw).Encode(map[string]string{"message": "ok"}) _ = enc.Encode(device)
} }

View file

@ -41,6 +41,9 @@ templ HomeContent(c *views.Context, data Data) {
@recentRangeInput(c) @recentRangeInput(c)
@nsfwToggle(c, data) @nsfwToggle(c, data)
</div> </div>
if data.TotalImages == 0 {
<h2 class="mt-4">There are no recently added images in the current time range.</h2>
}
for _, recently := range data.RecentlyAddedImages { for _, recently := range data.RecentlyAddedImages {
<div class="divider"></div> <div class="divider"></div>
<h2 class="mt-4">{ recently.Device.Name }</h2> <h2 class="mt-4">{ recently.Device.Name }</h2>