Files
zitadel/backend/v3/api/instance/v2/instance.go
Marco A. 39a29f534a feat(domain): Instance APIs with relational tables (#10953)
# Which Problems Are Solved

This PR implements the endpoints listed in
https://github.com/zitadel/zitadel/issues/10443 .

# How the Problems Are Solved

The implementation follows the same pattern as the Organization one.
There are no peculiarities to this PR. The `Update`, `Delete` are
implementing the `Commander` interface, while `Get` and `List`
instance(s) endpoints are implementing the `Querier` interace.

# Additional Context

- Closes #10443
- Depends on #10445
2025-10-28 14:17:19 +00:00

102 lines
3.6 KiB
Go

package instancev2
import (
"context"
"errors"
"connectrpc.com/connect"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/zitadel/zitadel/backend/v3/api/instance/v2/convert"
"github.com/zitadel/zitadel/backend/v3/domain"
"github.com/zitadel/zitadel/backend/v3/storage/database"
"github.com/zitadel/zitadel/backend/v3/storage/database/repository"
"github.com/zitadel/zitadel/internal/zerrors"
filter "github.com/zitadel/zitadel/pkg/grpc/filter/v2beta"
instance "github.com/zitadel/zitadel/pkg/grpc/instance/v2beta"
)
func DeleteInstance(ctx context.Context, request *connect.Request[instance.DeleteInstanceRequest]) (*connect.Response[instance.DeleteInstanceResponse], error) {
instanceDeleteCmd := domain.NewDeleteInstanceCommand(request.Msg.GetInstanceId())
err := domain.Invoke(ctx, instanceDeleteCmd, domain.WithInstanceRepo(repository.InstanceRepository()))
if err != nil {
if errors.Is(err, &database.NoRowFoundError{}) {
return nil, zerrors.ThrowNotFound(err, "INST-QVrUwc", "instance not found")
}
return nil, err
}
return &connect.Response[instance.DeleteInstanceResponse]{
Msg: &instance.DeleteInstanceResponse{
// TODO(IAM-Marco): Change this with the real update date when OrganizationRepo.Update()
// returns the timestamp
DeletionDate: timestamppb.Now(),
},
}, nil
}
func GetInstance(ctx context.Context, request *connect.Request[instance.GetInstanceRequest]) (*connect.Response[instance.GetInstanceResponse], error) {
instanceGetCmd := domain.NewGetInstanceCommand(request.Msg.GetInstanceId())
err := domain.Invoke(ctx, instanceGetCmd, domain.WithInstanceRepo(repository.InstanceRepository()))
if err != nil {
if errors.Is(err, &database.NoRowFoundError{}) {
return nil, zerrors.ThrowNotFound(err, "INST-QVrUwc", "instance not found")
}
return nil, err
}
return &connect.Response[instance.GetInstanceResponse]{
Msg: &instance.GetInstanceResponse{
Instance: convert.DomainInstanceModelToGRPCResponse(instanceGetCmd.Result()),
},
}, nil
}
func UpdateInstance(ctx context.Context, request *connect.Request[instance.UpdateInstanceRequest]) (*connect.Response[instance.UpdateInstanceResponse], error) {
instanceUpdateCmd := domain.NewUpdateInstanceCommand(request.Msg.GetInstanceId(), request.Msg.GetInstanceName())
err := domain.Invoke(ctx, instanceUpdateCmd, domain.WithInstanceRepo(repository.InstanceRepository()))
if err != nil {
return nil, err
}
return &connect.Response[instance.UpdateInstanceResponse]{
Msg: &instance.UpdateInstanceResponse{
// TODO(IAM-Marco): Change this with the real update date when InstanceRepo.Update()
// returns the timestamp
ChangeDate: timestamppb.Now(),
},
}, nil
}
func ListInstances(ctx context.Context, request *connect.Request[instance.ListInstancesRequest]) (*connect.Response[instance.ListInstancesResponse], error) {
instancesListCmd := domain.NewListInstancesCommand(request.Msg)
err := domain.Invoke(
ctx,
instancesListCmd,
domain.WithInstanceRepo(repository.InstanceRepository()),
domain.WithInstanceDomainRepo(repository.InstanceDomainRepository()),
)
if err != nil {
return nil, err
}
instances := instancesListCmd.Result()
return &connect.Response[instance.ListInstancesResponse]{
Msg: &instance.ListInstancesResponse{
Instances: convert.DomainInstanceListModelToGRPCResponse(instances),
Pagination: &filter.PaginationResponse{
// TODO(IAM-Marco): return correct value. Tracked in https://github.com/zitadel/zitadel/issues/10955
TotalResult: uint64(len(instances)),
AppliedLimit: uint64(request.Msg.GetPagination().GetLimit()),
},
},
}, nil
}