Files
magistrala/clients/api/http/endpoints.go
T
2025-08-25 18:06:41 +02:00

305 lines
7.5 KiB
Go

// Copyright (c) Abstract Machines
// SPDX-License-Identifier: Apache-2.0
package http
import (
"context"
api "github.com/absmach/supermq/api/http"
apiutil "github.com/absmach/supermq/api/http/util"
"github.com/absmach/supermq/clients"
"github.com/absmach/supermq/pkg/authn"
"github.com/absmach/supermq/pkg/errors"
svcerr "github.com/absmach/supermq/pkg/errors/service"
"github.com/go-kit/kit/endpoint"
)
func createClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(createClientReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
clients, _, err := svc.CreateClients(ctx, session, req.client)
if err != nil {
return nil, err
}
return createClientRes{
Client: clients[0],
created: true,
}, nil
}
}
func createClientsEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(createClientsReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
clients, _, err := svc.CreateClients(ctx, session, req.Clients...)
if err != nil {
return nil, err
}
res := clientsPageRes{
clientsPageMetaRes: clientsPageMetaRes{
Total: uint64(len(clients)),
},
Clients: []viewClientRes{},
}
for _, c := range clients {
res.Clients = append(res.Clients, viewClientRes{Client: c})
}
return res, nil
}
}
func viewClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(viewClientReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
c, err := svc.View(ctx, session, req.id, req.roles)
if err != nil {
return nil, err
}
return viewClientRes{Client: c}, nil
}
}
func listClientsEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(listClientsReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
var page clients.ClientsPage
var err error
switch req.userID != "" {
case true:
page, err = svc.ListUserClients(ctx, session, req.userID, req.Page)
default:
page, err = svc.ListClients(ctx, session, req.Page)
}
if err != nil {
return clientsPageRes{}, err
}
res := clientsPageRes{
clientsPageMetaRes: clientsPageMetaRes{
Total: page.Total,
Offset: page.Offset,
Limit: page.Limit,
},
Clients: []viewClientRes{},
}
for _, c := range page.Clients {
res.Clients = append(res.Clients, viewClientRes{Client: c})
}
return res, nil
}
}
func updateClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(updateClientReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
cli := clients.Client{
ID: req.id,
Name: req.Name,
Metadata: req.Metadata,
}
client, err := svc.Update(ctx, session, cli)
if err != nil {
return nil, err
}
return updateClientRes{Client: client}, nil
}
}
func updateClientTagsEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(updateClientTagsReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
cli := clients.Client{
ID: req.id,
Tags: req.Tags,
}
client, err := svc.UpdateTags(ctx, session, cli)
if err != nil {
return nil, err
}
return updateClientRes{Client: client}, nil
}
}
func updateClientSecretEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(updateClientCredentialsReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
client, err := svc.UpdateSecret(ctx, session, req.id, req.Secret)
if err != nil {
return nil, err
}
return updateClientRes{Client: client}, nil
}
}
func enableClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(changeClientStatusReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
client, err := svc.Enable(ctx, session, req.id)
if err != nil {
return nil, err
}
return changeClientStatusRes{Client: client}, nil
}
}
func disableClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(changeClientStatusReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
client, err := svc.Disable(ctx, session, req.id)
if err != nil {
return nil, err
}
return changeClientStatusRes{Client: client}, nil
}
}
func setClientParentGroupEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(setClientParentGroupReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
if err := svc.SetParentGroup(ctx, session, req.ParentGroupID, req.id); err != nil {
return nil, err
}
return setParentGroupRes{}, nil
}
}
func removeClientParentGroupEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(removeClientParentGroupReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
if err := svc.RemoveParentGroup(ctx, session, req.id); err != nil {
return nil, err
}
return removeParentGroupRes{}, nil
}
}
func deleteClientEndpoint(svc clients.Service) endpoint.Endpoint {
return func(ctx context.Context, request any) (any, error) {
req := request.(deleteClientReq)
if err := req.validate(); err != nil {
return nil, errors.Wrap(apiutil.ErrValidation, err)
}
session, ok := ctx.Value(api.SessionKey).(authn.Session)
if !ok {
return nil, svcerr.ErrAuthentication
}
if err := svc.Delete(ctx, session, req.id); err != nil {
return nil, err
}
return deleteClientRes{}, nil
}
}