51 lines
1.7 KiB
Go
51 lines
1.7 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"browser.local/platform/domain"
|
|
"browser.local/platform/dto"
|
|
)
|
|
|
|
// serverPluginDataCollection provides scoped, opaque plugin-owned records.
|
|
func (h *coreHandlers) serverPluginDataCollection(w http.ResponseWriter, r *http.Request) {
|
|
instance, err := h.core.GetServerInstanceForSession(bearerToken(r), r.PathValue("id"))
|
|
if err != nil {
|
|
writeServiceError(w, err)
|
|
return
|
|
}
|
|
collection := r.PathValue("collection")
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
limit, err := optionalPositiveInt(r.URL.Query().Get("limit"))
|
|
if err != nil || limit < 0 {
|
|
writeAPIError(w, http.StatusBadRequest, errorCodeBadRequest, "invalid plugin data limit", nil)
|
|
return
|
|
}
|
|
items, err := h.core.ListPluginDataForSession(bearerToken(r), domain.PluginDataFilter{PluginID: instance.PluginID, ServerInstanceID: instance.ID, Collection: collection, Key: r.URL.Query().Get("key"), Limit: limit})
|
|
if err != nil {
|
|
writeServiceError(w, err)
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, dto.PluginDataRecordsFromDomain(items))
|
|
case http.MethodPut:
|
|
request, err := decodeJSON[dto.PluginDataPutRequest](r)
|
|
if err != nil {
|
|
writeDecodeError(w, err)
|
|
return
|
|
}
|
|
value, err := h.core.PutPluginDataForSession(bearerToken(r), domain.PluginDataRecord{PluginID: instance.PluginID, ServerInstanceID: instance.ID, Collection: collection, Key: request.Key, Value: request.Value})
|
|
if err != nil {
|
|
writeServiceError(w, err)
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, dto.PluginDataRecordFromDomain(value))
|
|
default:
|
|
w.Header().Set("Allow", http.MethodGet+", "+http.MethodPut)
|
|
writeAPIError(w, http.StatusMethodNotAllowed, errorCodeMethodNotAllowed, "method not allowed", nil)
|
|
}
|
|
}
|
|
|
|
var _ = strconv.IntSize
|