@@ -6,20 +6,22 @@ import (
66 "fmt"
77 "net/http"
88
9+ "github.com/go-chi/chi/v5"
10+ "github.com/google/uuid"
911 "github.com/raphico/go-device-telemetry-api/internal/domain/device"
1012 "github.com/raphico/go-device-telemetry-api/internal/domain/user"
1113 "github.com/raphico/go-device-telemetry-api/internal/logger"
1214)
1315
1416type DeviceHandler struct {
15- log * logger.Logger
16- service * device.Service
17+ log * logger.Logger
18+ device * device.Service
1719}
1820
1921func NewDeviceHandler (log * logger.Logger , deviceService * device.Service ) * DeviceHandler {
2022 return & DeviceHandler {
21- log : log ,
22- service : deviceService ,
23+ log : log ,
24+ device : deviceService ,
2325 }
2426}
2527
@@ -30,7 +32,7 @@ type createDeviceRequest struct {
3032 Metadata map [string ]any `json:"metadata"`
3133}
3234
33- type createDeviceResponse struct {
35+ type deviceResponse struct {
3436 ID string `json:"id"`
3537 Name string `json:"name"`
3638 DeviceType string `json:"device_type"`
@@ -52,7 +54,7 @@ func (h *DeviceHandler) HandleCreateDevice(w http.ResponseWriter, r *http.Reques
5254 WriteUnauthorizedError (w )
5355 }
5456
55- d , err := h .service .CreateDevice (r .Context (), userId , req .Name , req .Status , req .DeviceType , req .Metadata )
57+ dev , err := h .device .CreateDevice (r .Context (), userId , req .Name , req .Status , req .DeviceType , req .Metadata )
5658 if err != nil {
5759 switch {
5860 case errors .Is (err , device .ErrNameRequired ),
@@ -76,17 +78,52 @@ func (h *DeviceHandler) HandleCreateDevice(w http.ResponseWriter, r *http.Reques
7678 }
7779 }
7880
79- res := createDeviceResponse {
80- ID : d .ID .String (),
81- Name : d .Name .String (),
82- DeviceType : string (d .DeviceType ),
83- Status : string (d .Status ),
84- Metadata : d .Metadata ,
81+ res := deviceResponse {
82+ ID : dev .ID .String (),
83+ Name : dev .Name .String (),
84+ DeviceType : string (dev .DeviceType ),
85+ Status : string (dev .Status ),
86+ Metadata : dev .Metadata ,
8587 }
8688
8789 WriteJSON (w , http .StatusCreated , res , nil )
8890}
8991
90- func (h * DeviceHandler ) HandleGetDeviceById (w http.ResponseWriter , r * http.Request ) {
92+ func (h * DeviceHandler ) HandleGetDevice (w http.ResponseWriter , r * http.Request ) {
93+ idStr := chi .URLParam (r , "id" )
9194
95+ id , err := uuid .Parse (idStr )
96+ if err != nil {
97+ WriteJSONError (w , http .StatusBadRequest , invalidRequest , "invalid device id" )
98+ return
99+ }
100+
101+ userId , ok := GetUserID (r .Context ())
102+ if ! ok {
103+ h .log .Debug (fmt .Sprint ("missing user id in context" , "path" , r .URL .Path ))
104+ WriteUnauthorizedError (w )
105+ return
106+ }
107+
108+ dev , err := h .device .GetDevice (r .Context (), device .DeviceID (id ), userId )
109+ if err != nil {
110+ switch {
111+ case errors .Is (err , device .ErrDeviceNotFound ):
112+ WriteJSONError (w , http .StatusBadRequest , invalidRequest , "device not found" )
113+ default :
114+ h .log .Error (fmt .Sprintf ("failed to get device: %v" , err ))
115+ WriteInternalError (w )
116+ }
117+ return
118+ }
119+
120+ res := deviceResponse {
121+ ID : dev .ID .String (),
122+ Name : dev .Name .String (),
123+ DeviceType : string (dev .DeviceType ),
124+ Status : string (dev .Status ),
125+ Metadata : dev .Metadata ,
126+ }
127+
128+ WriteJSON (w , http .StatusOK , res , nil )
92129}
0 commit comments