Files
b339a3e696 feat: instance domain APIs with relational tables (#11051)
# Which Problems Are Solved

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

# How the Problems Are Solved

The implementation follows the same pattern as the Instance one. The
`Add` and `Remove` are implementing the `Commander` interface, while
`List` Domains endpoints are implementing the `Querier` interace.

The PR adds also some forgotten calls to the relational logic for the
Instance API. The commits are identifiable by the label `instance:`
prepended to them. This is the complete list: bafce01b0 , 6fe7257ab ,
e27bc9c34 , 8133ede73 , fde667953 , a3e1135ed , ee1a6f9c1

# Additional Context

- Closes #10444

---------

Co-authored-by: Elio Bischof <[email protected]>
Co-authored-by: Lebogang Phoshoko <[email protected]>
Co-authored-by: Wim Van Laer <[email protected]>
Co-authored-by: Max Peintner <[email protected]>
Co-authored-by: Gayathri Vijayan <[email protected]>
2025-12-17 12:01:09 +01:00

121 lines
3.7 KiB
Go

package convert
import (
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/zitadel/zitadel/backend/v3/domain"
"github.com/zitadel/zitadel/cmd/build"
"github.com/zitadel/zitadel/pkg/grpc/filter/v2"
instance_v2 "github.com/zitadel/zitadel/pkg/grpc/instance/v2"
instance_v2beta "github.com/zitadel/zitadel/pkg/grpc/instance/v2beta"
)
/*
* Domain Model to GRPC v2Beta
*/
func DomainInstanceListModelToGRPCBetaResponse(instances []*domain.Instance) []*instance_v2beta.Instance {
toReturn := make([]*instance_v2beta.Instance, len(instances))
for i, inst := range instances {
toReturn[i] = DomainInstanceModelToGRPCBetaResponse(inst)
}
return toReturn
}
func DomainInstanceModelToGRPCBetaResponse(inst *domain.Instance) *instance_v2beta.Instance {
return &instance_v2beta.Instance{
Id: inst.ID,
ChangeDate: timestamppb.New(inst.UpdatedAt),
CreationDate: timestamppb.New(inst.CreatedAt),
Name: inst.Name,
Version: build.Version(),
Domains: DomainInstanceDomainListModelToGRPCBetaResponse(inst.Domains),
}
}
/*
* Domain Model to GRPC v2
*/
func DomainInstanceListModelToGRPCResponse(instances []*domain.Instance) []*instance_v2.Instance {
toReturn := make([]*instance_v2.Instance, len(instances))
for i, inst := range instances {
toReturn[i] = DomainInstanceModelToGRPCResponse(inst)
}
return toReturn
}
func DomainInstanceModelToGRPCResponse(inst *domain.Instance) *instance_v2.Instance {
return &instance_v2.Instance{
Id: inst.ID,
ChangeDate: timestamppb.New(inst.UpdatedAt),
CreationDate: timestamppb.New(inst.CreatedAt),
State: instance_v2.State_STATE_RUNNING, // TODO(IAM-Marco): Not sure what to put here
Name: inst.Name,
Version: build.Version(),
CustomDomains: DomainInstanceDomainListModelToGRPCResponse(inst.Domains),
}
}
/*
* GRPC v2Beta Requests to GRPC v2
*/
func ListInstancesBetaRequestToV2Request(in *instance_v2beta.ListInstancesRequest) *instance_v2.ListInstancesRequest {
return &instance_v2.ListInstancesRequest{
Pagination: &filter.PaginationRequest{
Offset: in.GetPagination().GetOffset(),
Limit: in.GetPagination().GetLimit(),
Asc: in.GetPagination().GetAsc(),
},
SortingColumn: listInstancesBetaSortingColToV2Request(in.SortingColumn),
Filters: listInstancesQueriesToV2Request(in.GetQueries()),
}
}
func listInstancesQueriesToV2Request(queries []*instance_v2beta.Query) []*instance_v2.Filter {
toReturn := make([]*instance_v2.Filter, len(queries))
for i, query := range queries {
switch assertedQuery := query.GetQuery().(type) {
case *instance_v2beta.Query_DomainQuery:
filter := &instance_v2.Filter_CustomDomainsFilter{
CustomDomainsFilter: &instance_v2.CustomDomainsFilter{
Domains: assertedQuery.DomainQuery.GetDomains(),
},
}
toReturn[i] = &instance_v2.Filter{Filter: filter}
case *instance_v2beta.Query_IdQuery:
filter := &instance_v2.Filter_InIdsFilter{
InIdsFilter: &filter.InIDsFilter{
Ids: assertedQuery.IdQuery.GetIds(),
},
}
toReturn[i] = &instance_v2.Filter{Filter: filter}
}
}
return toReturn
}
func listInstancesBetaSortingColToV2Request(fieldName *instance_v2beta.FieldName) instance_v2.FieldName {
if fieldName == nil {
return instance_v2.FieldName_FIELD_NAME_UNSPECIFIED
}
switch *fieldName {
case instance_v2beta.FieldName_FIELD_NAME_CREATION_DATE:
return instance_v2.FieldName_FIELD_NAME_CREATION_DATE
case instance_v2beta.FieldName_FIELD_NAME_ID:
return instance_v2.FieldName_FIELD_NAME_ID
case instance_v2beta.FieldName_FIELD_NAME_NAME:
return instance_v2.FieldName_FIELD_NAME_NAME
case instance_v2beta.FieldName_FIELD_NAME_UNSPECIFIED:
fallthrough
default:
return instance_v2.FieldName_FIELD_NAME_UNSPECIFIED
}
}