mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-08-20 03:46:29 +00:00
136 lines
4.0 KiB
Go
136 lines
4.0 KiB
Go
package scimsync
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/pocket-id/pocket-id/backend/internal/dto"
|
|
"github.com/pocket-id/pocket-id/backend/internal/httpserver"
|
|
)
|
|
|
|
type handler struct {
|
|
service *Service
|
|
}
|
|
|
|
func newHandler(service *Service) *handler {
|
|
return &handler{service: service}
|
|
}
|
|
|
|
// getServiceProviderByClient godoc
|
|
// @Summary Get SCIM service provider
|
|
// @Description Get the SCIM service provider configuration for an OIDC client
|
|
// @Tags OIDC
|
|
// @Produce json
|
|
// @Param id path string true "Client ID"
|
|
// @Success 200 {object} ScimServiceProviderDTO "SCIM service provider configuration"
|
|
// @Failure default {object} dto.ErrorDto "Error"
|
|
// @Router /api/oidc/clients/{id}/scim-service-provider [get]
|
|
func (h *handler) getServiceProviderByClient(c *gin.Context) error {
|
|
provider, err := h.service.GetServiceProviderByClient(c.Request.Context(), c.Param("id"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return respondWithServiceProvider(c, http.StatusOK, provider)
|
|
}
|
|
|
|
// syncServiceProvider godoc
|
|
// @Summary Sync SCIM service provider
|
|
// @Description Trigger synchronization for a SCIM service provider
|
|
// @Tags SCIM
|
|
// @Param id path string true "Service Provider ID"
|
|
// @Success 200 "OK"
|
|
// @Failure default {object} dto.ErrorDto "Error"
|
|
// @Router /api/scim/service-provider/{id}/sync [post]
|
|
func (h *handler) syncServiceProvider(c *gin.Context) error {
|
|
// The sync runs inline rather than through the actor so the response reports whether it succeeded
|
|
err := h.service.SyncServiceProvider(c.Request.Context(), c.Param("id"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Status(http.StatusOK)
|
|
return nil
|
|
}
|
|
|
|
// createServiceProvider godoc
|
|
// @Summary Create SCIM service provider
|
|
// @Description Create a new SCIM service provider
|
|
// @Tags SCIM
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param serviceProvider body ScimServiceProviderCreateDTO true "SCIM service provider information"
|
|
// @Success 201 {object} ScimServiceProviderDTO "Created SCIM service provider"
|
|
// @Failure default {object} dto.ErrorDto "Error"
|
|
// @Router /api/scim/service-provider [post]
|
|
func (h *handler) createServiceProvider(c *gin.Context) error {
|
|
var input ScimServiceProviderCreateDTO
|
|
err := httpserver.BindJSON(c, &input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
provider, err := h.service.CreateServiceProvider(c.Request.Context(), &input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return respondWithServiceProvider(c, http.StatusCreated, provider)
|
|
}
|
|
|
|
// updateServiceProvider godoc
|
|
// @Summary Update SCIM service provider
|
|
// @Description Update an existing SCIM service provider
|
|
// @Tags SCIM
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "Service Provider ID"
|
|
// @Param serviceProvider body ScimServiceProviderCreateDTO true "SCIM service provider information"
|
|
// @Success 200 {object} ScimServiceProviderDTO "Updated SCIM service provider"
|
|
// @Failure default {object} dto.ErrorDto "Error"
|
|
// @Router /api/scim/service-provider/{id} [put]
|
|
func (h *handler) updateServiceProvider(c *gin.Context) error {
|
|
var input ScimServiceProviderCreateDTO
|
|
err := httpserver.BindJSON(c, &input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
provider, err := h.service.UpdateServiceProvider(c.Request.Context(), c.Param("id"), &input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return respondWithServiceProvider(c, http.StatusOK, provider)
|
|
}
|
|
|
|
// deleteServiceProvider godoc
|
|
// @Summary Delete SCIM service provider
|
|
// @Description Delete a SCIM service provider by ID
|
|
// @Tags SCIM
|
|
// @Param id path string true "Service Provider ID"
|
|
// @Success 204 "No Content"
|
|
// @Failure default {object} dto.ErrorDto "Error"
|
|
// @Router /api/scim/service-provider/{id} [delete]
|
|
func (h *handler) deleteServiceProvider(c *gin.Context) error {
|
|
err := h.service.DeleteServiceProvider(c.Request.Context(), c.Param("id"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Status(http.StatusNoContent)
|
|
return nil
|
|
}
|
|
|
|
func respondWithServiceProvider(c *gin.Context, status int, provider ServiceProvider) error {
|
|
var output ScimServiceProviderDTO
|
|
err := dto.MapStruct(provider, &output)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.JSON(status, output)
|
|
return nil
|
|
}
|