Files
zitadel/internal/query/instance_by_domain.sql
b0609aa861 feat(api): return allowed_languages (#11553)
# Which Problems Are Solved

While Zitadel provides a possibility to restrict certain languages to be
used, the corresponding list could not be retrieved in the settings
service (v2). This blocked login v2 implementations from respecting the
list and they would always use all available languages.

# How the Problems Are Solved

- Retrieve the list when checking the instance and pass it into the
context.
- Return it as part of the existing `GetGeneralSettingsResponse`
- This allows us to remove an additional query in some other cases /
endpoints.

# Additional Changes

none

# Additional Context

- required for https://github.com/zitadel/zitadel/pull/11372
- backport to v4.x

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Marco A. <marco@zitadel.com>
2026-02-12 08:44:34 +00:00

87 lines
2.8 KiB
SQL

with domain as (
SELECT instance_id FROM eventstore.fields
WHERE object_type = 'instance_domain'
AND object_id = $1
AND field_name = 'domain'
), instance_features as (
select i.*
from domain d
join projections.instance_features5 i on d.instance_id = i.instance_id
), features as (
select instance_id, json_object_agg(
coalesce(i.key, s.key),
coalesce(i.value, s.value)
) features
from domain d
cross join projections.system_features4 s
full outer join instance_features i using (instance_id, key)
group by instance_id
), external_domains as (
select ed.instance_id, array_agg(ed.domain) as domains
from domain d
join projections.instance_domains ed on d.instance_id = ed.instance_id
group by ed.instance_id
), trusted_domains as (
select td.instance_id, array_agg(td.domain) as domains
from domain d
join projections.instance_trusted_domains td on d.instance_id = td.instance_id
group by td.instance_id
), execution_targets as (
select instance_id, json_agg(x.execution_targets) as execution_targets from (
select e.instance_id, json_build_object(
'execution_id', et.execution_id,
'target_id', t.id,
'target_type', t.target_type,
'endpoint', t.endpoint,
'timeout', t.timeout,
'interrupt_on_error', t.interrupt_on_error,
'signing_key', t.signing_key,
'payload_type', t.payload_type,
'encryption_key', encode(k.public_key, 'base64'),
'encryption_key_id', k.id
) as execution_targets
from domain d
join projections.executions1 e
on d.instance_id = e.instance_id
join projections.executions1_targets et
on e.instance_id = et.instance_id
and e.id = et.execution_id
join projections.targets2 t
on et.instance_id = t.instance_id
and et.target_id = t.id
left join projections.authn_keys2 k
on k.instance_id = et.instance_id
and k.object_id = t.id
and k.enabled = true
and (k.expiration IS NULL or k.expiration > now())
order by et.position asc
) as x
group by instance_id
)
select
i.id,
i.default_org_id,
i.iam_project_id,
i.console_client_id,
i.console_app_id,
i.default_language,
s.enable_iframe_embedding,
s.origins,
s.enable_impersonation,
l.audit_log_retention,
l.block,
f.features,
ed.domains as external_domains,
td.domains as trusted_domains,
et.execution_targets,
r.allowed_languages
from domain d
join projections.instances i on i.id = d.instance_id
left join projections.security_policies2 s on i.id = s.instance_id
left join projections.limits l on i.id = l.instance_id
left join features f on i.id = f.instance_id
left join external_domains ed on i.id = ed.instance_id
left join trusted_domains td on i.id = td.instance_id
left join execution_targets et on i.id = et.instance_id
left join projections.restrictions2 r on i.id = r.instance_id;