package api import ( "net/http" "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)) case http.MethodDelete: if err := h.core.DeletePluginDataForSession(bearerToken(r), instance.PluginID, instance.ID, collection, r.URL.Query().Get("key")); err != nil { writeServiceError(w, err) return } w.WriteHeader(http.StatusNoContent) default: w.Header().Set("Allow", http.MethodGet+", "+http.MethodPut+", "+http.MethodDelete) writeAPIError(w, http.StatusMethodNotAllowed, errorCodeMethodNotAllowed, "method not allowed", nil) } } func (h *coreHandlers) serverPluginDataTransaction(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { w.Header().Set("Allow", http.MethodPost) writeAPIError(w, http.StatusMethodNotAllowed, errorCodeMethodNotAllowed, "method not allowed", nil) return } instance, err := h.core.GetServerInstanceForSession(bearerToken(r), r.PathValue("id")) if err != nil { writeServiceError(w, err) return } request, err := decodeJSON[dto.PluginDataTransactionRequest](r) if err != nil { writeDecodeError(w, err) return } values, err := h.core.ApplyPluginDataTransactionForSession(bearerToken(r), request.ToDomain(instance.PluginID, instance.ID, r.PathValue("collection"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.PluginDataRecordsFromDomain(values)) }