feat(database): support for postgres (#3998)

* beginning with postgres statements

* try pgx

* use pgx

* database

* init works for postgres

* arrays working

* init for cockroach

* init

* start tests

* tests

* TESTS

* ch

* ch

* chore: use go 1.18

* read stmts

* fix typo

* tests

* connection string

* add missing error handler

* cleanup

* start all apis

* go mod tidy

* old update

* switch back to minute

* on conflict

* replace string slice with `database.StringArray` in db models

* fix tests and start

* update go version in dockerfile

* setup go

* clean up

* remove notification migration

* update

* docs: add deploy guide for postgres

* fix: revert sonyflake

* use `database.StringArray` for daos

* use `database.StringArray` every where

* new tables

* index naming,
metadata primary key,
project grant role key type

* docs(postgres): change to beta

* chore: correct compose

* fix(defaults): add empty postgres config

* refactor: remove unused code

* docs: add postgres to self hosted

* fix broken link

* so?

* change title

* add mdx to link

* fix stmt

* update goreleaser in test-code

* docs: improve postgres example

* update more projections

* fix: add beta log for postgres

* revert index name change

* prerelease

* fix: add sequence to v1 "reduce paniced"

* log if nil

* add logging

* fix: log output

* fix(import): check if org exists and user

* refactor: imports

* fix(user): ignore malformed events

* refactor: method naming

* fix: test

* refactor: correct errors.Is call

* ci: don't build dev binaries on main

* fix(go releaser): update version to 1.11.0

* fix(user): projection should not break

* fix(user): handle error properly

* docs: correct config example

* Update .releaserc.js

* Update .releaserc.js

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
Co-authored-by: Elio Bischof <eliobischof@gmail.com>
This commit is contained in:
Silvan
2022-08-31 09:52:43 +02:00
committed by GitHub
parent d6c9815945
commit 77b4fc5487
189 changed files with 3401 additions and 2956 deletions

View File

@@ -8,9 +8,8 @@ import (
"regexp"
"testing"
"github.com/lib/pq"
"github.com/zitadel/zitadel/internal/crypto"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
errs "github.com/zitadel/zitadel/internal/errors"
)
@@ -31,33 +30,33 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPByIDQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint`+
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
nil,
nil,
),
@@ -75,33 +74,33 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPByIDQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint`+
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -146,7 +145,7 @@ func Test_IDPPrepares(t *testing.T) {
"oidc-client-id",
nil,
"oidc-issuer",
pq.StringArray{"scope"},
database.StringArray{"scope"},
domain.OIDCMappingFieldEmail,
domain.OIDCMappingFieldPreferredLoginName,
"auth.endpoint.ch",
@@ -176,7 +175,7 @@ func Test_IDPPrepares(t *testing.T) {
ClientID: "oidc-client-id",
ClientSecret: &crypto.CryptoValue{},
Issuer: "oidc-issuer",
Scopes: []string{"scope"},
Scopes: database.StringArray{"scope"},
DisplayNameMapping: domain.OIDCMappingFieldEmail,
UsernameMapping: domain.OIDCMappingFieldPreferredLoginName,
AuthorizationEndpoint: "auth.endpoint.ch",
@@ -189,33 +188,33 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPByIDQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint`+
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -299,33 +298,33 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPByIDQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint`+
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -402,33 +401,33 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPByIDQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint`+
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -445,34 +444,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
nil,
nil,
),
@@ -490,34 +489,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -564,7 +563,7 @@ func Test_IDPPrepares(t *testing.T) {
"oidc-client-id",
nil,
"oidc-issuer",
pq.StringArray{"scope"},
database.StringArray{"scope"},
domain.OIDCMappingFieldEmail,
domain.OIDCMappingFieldPreferredLoginName,
"auth.endpoint.ch",
@@ -600,7 +599,7 @@ func Test_IDPPrepares(t *testing.T) {
ClientID: "oidc-client-id",
ClientSecret: &crypto.CryptoValue{},
Issuer: "oidc-issuer",
Scopes: []string{"scope"},
Scopes: database.StringArray{"scope"},
DisplayNameMapping: domain.OIDCMappingFieldEmail,
UsernameMapping: domain.OIDCMappingFieldPreferredLoginName,
AuthorizationEndpoint: "auth.endpoint.ch",
@@ -615,34 +614,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -735,34 +734,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -848,34 +847,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
[]string{
"id",
"resource_owner",
@@ -949,7 +948,7 @@ func Test_IDPPrepares(t *testing.T) {
"oidc-client-id",
nil,
"oidc-issuer",
pq.StringArray{"scope"},
database.StringArray{"scope"},
domain.OIDCMappingFieldEmail,
domain.OIDCMappingFieldPreferredLoginName,
"auth.endpoint.ch",
@@ -1025,7 +1024,7 @@ func Test_IDPPrepares(t *testing.T) {
ClientID: "oidc-client-id",
ClientSecret: &crypto.CryptoValue{},
Issuer: "oidc-issuer",
Scopes: []string{"scope"},
Scopes: database.StringArray{"scope"},
DisplayNameMapping: domain.OIDCMappingFieldEmail,
UsernameMapping: domain.OIDCMappingFieldPreferredLoginName,
AuthorizationEndpoint: "auth.endpoint.ch",
@@ -1059,34 +1058,34 @@ func Test_IDPPrepares(t *testing.T) {
prepare: prepareIDPsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.idps.id,`+
` projections.idps.resource_owner,`+
` projections.idps.creation_date,`+
` projections.idps.change_date,`+
` projections.idps.sequence,`+
` projections.idps.state,`+
` projections.idps.name,`+
` projections.idps.styling_type,`+
` projections.idps.owner_type,`+
` projections.idps.auto_register,`+
` projections.idps_oidc_config.idp_id,`+
` projections.idps_oidc_config.client_id,`+
` projections.idps_oidc_config.client_secret,`+
` projections.idps_oidc_config.issuer,`+
` projections.idps_oidc_config.scopes,`+
` projections.idps_oidc_config.display_name_mapping,`+
` projections.idps_oidc_config.username_mapping,`+
` projections.idps_oidc_config.authorization_endpoint,`+
` projections.idps_oidc_config.token_endpoint,`+
` projections.idps_jwt_config.idp_id,`+
` projections.idps_jwt_config.issuer,`+
` projections.idps_jwt_config.keys_endpoint,`+
` projections.idps_jwt_config.header_name,`+
` projections.idps_jwt_config.endpoint,`+
regexp.QuoteMeta(`SELECT projections.idps2.id,`+
` projections.idps2.resource_owner,`+
` projections.idps2.creation_date,`+
` projections.idps2.change_date,`+
` projections.idps2.sequence,`+
` projections.idps2.state,`+
` projections.idps2.name,`+
` projections.idps2.styling_type,`+
` projections.idps2.owner_type,`+
` projections.idps2.auto_register,`+
` projections.idps2_oidc_config.idp_id,`+
` projections.idps2_oidc_config.client_id,`+
` projections.idps2_oidc_config.client_secret,`+
` projections.idps2_oidc_config.issuer,`+
` projections.idps2_oidc_config.scopes,`+
` projections.idps2_oidc_config.display_name_mapping,`+
` projections.idps2_oidc_config.username_mapping,`+
` projections.idps2_oidc_config.authorization_endpoint,`+
` projections.idps2_oidc_config.token_endpoint,`+
` projections.idps2_jwt_config.idp_id,`+
` projections.idps2_jwt_config.issuer,`+
` projections.idps2_jwt_config.keys_endpoint,`+
` projections.idps2_jwt_config.header_name,`+
` projections.idps2_jwt_config.endpoint,`+
` COUNT(*) OVER ()`+
` FROM projections.idps`+
` LEFT JOIN projections.idps_oidc_config ON projections.idps.id = projections.idps_oidc_config.idp_id`+
` LEFT JOIN projections.idps_jwt_config ON projections.idps.id = projections.idps_jwt_config.idp_id`),
` FROM projections.idps2`+
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id`+
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {