mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 17:27:31 +00:00
fix(org): adding unique constrants to not allow an org to be added twice with same id (#10243)
# Which Problems Are Solved When adding 2 orgs with the same ID, you get a positive response from the API, later when the org is projected, it errors due to the id already in use # How the Problems Are Solved Check org with orgID specified does not already exist before adding events # Additional Changes Added additional test case for adding same org with same name twice # Additional Context - Closes https://github.com/zitadel/zitadel/issues/10127 --------- Co-authored-by: Silvan <27845747+adlerhurst@users.noreply.github.com>
This commit is contained in:
@@ -47,14 +47,17 @@ func TestMain(m *testing.M) {
|
|||||||
func TestServer_CreateOrganization(t *testing.T) {
|
func TestServer_CreateOrganization(t *testing.T) {
|
||||||
idpResp := Instance.AddGenericOAuthProvider(CTX, Instance.DefaultOrg.Id)
|
idpResp := Instance.AddGenericOAuthProvider(CTX, Instance.DefaultOrg.Id)
|
||||||
|
|
||||||
tests := []struct {
|
type test struct {
|
||||||
name string
|
name string
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
req *v2beta_org.CreateOrganizationRequest
|
req *v2beta_org.CreateOrganizationRequest
|
||||||
id string
|
id string
|
||||||
want *v2beta_org.CreateOrganizationResponse
|
testFunc func(ctx context.Context, t *testing.T)
|
||||||
wantErr bool
|
want *v2beta_org.CreateOrganizationResponse
|
||||||
}{
|
wantErr bool
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []test{
|
||||||
{
|
{
|
||||||
name: "missing permission",
|
name: "missing permission",
|
||||||
ctx: Instance.WithAuthorization(CTX, integration.UserTypeOrgOwner),
|
ctx: Instance.WithAuthorization(CTX, integration.UserTypeOrgOwner),
|
||||||
@@ -73,6 +76,25 @@ func TestServer_CreateOrganization(t *testing.T) {
|
|||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
|
func() test {
|
||||||
|
orgName := gofakeit.Name()
|
||||||
|
return test{
|
||||||
|
name: "adding org with same name twice",
|
||||||
|
ctx: CTX,
|
||||||
|
req: &v2beta_org.CreateOrganizationRequest{
|
||||||
|
Name: orgName,
|
||||||
|
Admins: nil,
|
||||||
|
},
|
||||||
|
testFunc: func(ctx context.Context, t *testing.T) {
|
||||||
|
// create org initially
|
||||||
|
_, err := Client.CreateOrganization(ctx, &v2beta_org.CreateOrganizationRequest{
|
||||||
|
Name: orgName,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
}
|
||||||
|
}(),
|
||||||
{
|
{
|
||||||
name: "invalid admin type",
|
name: "invalid admin type",
|
||||||
ctx: CTX,
|
ctx: CTX,
|
||||||
@@ -212,9 +234,34 @@ func TestServer_CreateOrganization(t *testing.T) {
|
|||||||
Id: "custom_id",
|
Id: "custom_id",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
func() test {
|
||||||
|
orgID := gofakeit.Name()
|
||||||
|
return test{
|
||||||
|
name: "adding org with same ID twice",
|
||||||
|
ctx: CTX,
|
||||||
|
req: &v2beta_org.CreateOrganizationRequest{
|
||||||
|
Id: &orgID,
|
||||||
|
Name: gofakeit.Name(),
|
||||||
|
Admins: nil,
|
||||||
|
},
|
||||||
|
testFunc: func(ctx context.Context, t *testing.T) {
|
||||||
|
// create org initially
|
||||||
|
_, err := Client.CreateOrganization(ctx, &v2beta_org.CreateOrganizationRequest{
|
||||||
|
Id: &orgID,
|
||||||
|
Name: gofakeit.Name(),
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
}
|
||||||
|
}(),
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.testFunc != nil {
|
||||||
|
tt.testFunc(tt.ctx, t)
|
||||||
|
}
|
||||||
|
|
||||||
got, err := Client.CreateOrganization(tt.ctx, tt.req)
|
got, err := Client.CreateOrganization(tt.ctx, tt.req)
|
||||||
if tt.wantErr {
|
if tt.wantErr {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
|
@@ -276,6 +276,15 @@ func (c *Commands) SetUpOrg(ctx context.Context, o *OrgSetup, allowInitialMail b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// because users can choose their own ID, we must check that an org with the same ID does not already exist
|
||||||
|
existingOrg, err := c.getOrgWriteModelByID(ctx, o.OrgID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existingOrg.State.Exists() {
|
||||||
|
return nil, zerrors.ThrowAlreadyExists(nil, "ORG-laho2n", "Errors.Org.AlreadyExisting")
|
||||||
|
}
|
||||||
|
|
||||||
return c.setUpOrgWithIDs(ctx, o, o.OrgID, allowInitialMail, userIDs...)
|
return c.setUpOrgWithIDs(ctx, o, o.OrgID, allowInitialMail, userIDs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,12 +336,13 @@ func (c *Commands) AddOrgWithID(ctx context.Context, name, userID, resourceOwner
|
|||||||
ctx, span := tracing.NewSpan(ctx)
|
ctx, span := tracing.NewSpan(ctx)
|
||||||
defer func() { span.EndWithError(err) }()
|
defer func() { span.EndWithError(err) }()
|
||||||
|
|
||||||
|
// because users can choose their own ID, we must check that an org with the same ID does not already exist
|
||||||
existingOrg, err := c.getOrgWriteModelByID(ctx, orgID)
|
existingOrg, err := c.getOrgWriteModelByID(ctx, orgID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if existingOrg.State != domain.OrgStateUnspecified {
|
if existingOrg.State.Exists() {
|
||||||
return nil, zerrors.ThrowNotFound(nil, "ORG-lapo2m", "Errors.Org.AlreadyExisting")
|
return nil, zerrors.ThrowAlreadyExists(nil, "ORG-lapo2n", "Errors.Org.AlreadyExisting")
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.addOrgWithIDAndMember(ctx, name, userID, resourceOwner, orgID, setOrgInactive, claimedUserIDs)
|
return c.addOrgWithIDAndMember(ctx, name, userID, resourceOwner, orgID, setOrgInactive, claimedUserIDs)
|
||||||
|
@@ -1293,7 +1293,9 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "org name empty, error",
|
name: "org name empty, error",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(),
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(), // org already exists check
|
||||||
|
),
|
||||||
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID"),
|
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID"),
|
||||||
},
|
},
|
||||||
args: args{
|
args: args{
|
||||||
@@ -1326,6 +1328,7 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
name: "userID not existing, error",
|
name: "userID not existing, error",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(), // org already exists check
|
||||||
expectFilter(),
|
expectFilter(),
|
||||||
),
|
),
|
||||||
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID"),
|
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID"),
|
||||||
@@ -1348,7 +1351,9 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "human invalid, error",
|
name: "human invalid, error",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(),
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(), // org already exists check
|
||||||
|
),
|
||||||
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID", "userID"),
|
idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "orgID", "userID"),
|
||||||
},
|
},
|
||||||
args: args{
|
args: args{
|
||||||
@@ -1381,6 +1386,7 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(
|
eventstore: expectEventstore(
|
||||||
expectFilter(), // add human exists check
|
expectFilter(), // add human exists check
|
||||||
|
expectFilter(),
|
||||||
expectFilter(
|
expectFilter(
|
||||||
eventFromEventPusher(
|
eventFromEventPusher(
|
||||||
org.NewDomainPolicyAddedEvent(context.Background(),
|
org.NewDomainPolicyAddedEvent(context.Background(),
|
||||||
@@ -1501,10 +1507,82 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "org already exists",
|
||||||
|
fields: fields{
|
||||||
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(
|
||||||
|
eventFromEventPusher(
|
||||||
|
org.NewOrgAddedEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate, "Org"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
args: args{
|
||||||
|
ctx: http_util.WithRequestedHost(context.Background(), "iam-domain"),
|
||||||
|
setupOrg: &OrgSetup{
|
||||||
|
Name: "Org",
|
||||||
|
OrgID: "custom-org-ID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
err: zerrors.ThrowAlreadyExists(nil, "ORG-laho2n", "Errors.Org.AlreadyExisting"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "org with same id deleted",
|
||||||
|
fields: fields{
|
||||||
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(
|
||||||
|
eventFromEventPusher(
|
||||||
|
org.NewOrgAddedEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate, "Org"),
|
||||||
|
),
|
||||||
|
org.NewOrgRemovedEvent(
|
||||||
|
context.Background(), &org.NewAggregate("custom-org-ID").Aggregate,
|
||||||
|
"Org", []string{}, false, []string{}, []*domain.UserIDPLink{}, []string{}),
|
||||||
|
),
|
||||||
|
expectPush(
|
||||||
|
eventFromEventPusher(org.NewOrgAddedEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate,
|
||||||
|
"Org",
|
||||||
|
)),
|
||||||
|
eventFromEventPusher(org.NewDomainAddedEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate, "org.iam-domain",
|
||||||
|
)),
|
||||||
|
eventFromEventPusher(org.NewDomainVerifiedEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate,
|
||||||
|
"org.iam-domain",
|
||||||
|
)),
|
||||||
|
eventFromEventPusher(org.NewDomainPrimarySetEvent(context.Background(),
|
||||||
|
&org.NewAggregate("custom-org-ID").Aggregate,
|
||||||
|
"org.iam-domain",
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
args: args{
|
||||||
|
ctx: http_util.WithRequestedHost(context.Background(), "iam-domain"),
|
||||||
|
setupOrg: &OrgSetup{
|
||||||
|
Name: "Org",
|
||||||
|
OrgID: "custom-org-ID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
createdOrg: &CreatedOrg{
|
||||||
|
ObjectDetails: &domain.ObjectDetails{
|
||||||
|
ResourceOwner: "custom-org-ID",
|
||||||
|
},
|
||||||
|
OrgAdmins: []OrgAdmin{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "no human added, custom org ID",
|
name: "no human added, custom org ID",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(), // org already exists check
|
||||||
expectPush(
|
expectPush(
|
||||||
eventFromEventPusher(org.NewOrgAddedEvent(context.Background(),
|
eventFromEventPusher(org.NewOrgAddedEvent(context.Background(),
|
||||||
&org.NewAggregate("custom-org-ID").Aggregate,
|
&org.NewAggregate("custom-org-ID").Aggregate,
|
||||||
@@ -1544,6 +1622,7 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
name: "existing human added",
|
name: "existing human added",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(
|
eventstore: expectEventstore(
|
||||||
|
expectFilter(), // org already exists check
|
||||||
expectFilter(
|
expectFilter(
|
||||||
eventFromEventPusher(
|
eventFromEventPusher(
|
||||||
user.NewHumanAddedEvent(context.Background(),
|
user.NewHumanAddedEvent(context.Background(),
|
||||||
@@ -1616,6 +1695,7 @@ func TestCommandSide_SetUpOrg(t *testing.T) {
|
|||||||
fields: fields{
|
fields: fields{
|
||||||
eventstore: expectEventstore(
|
eventstore: expectEventstore(
|
||||||
expectFilter(), // add machine exists check
|
expectFilter(), // add machine exists check
|
||||||
|
expectFilter(),
|
||||||
expectFilter(
|
expectFilter(
|
||||||
eventFromEventPusher(
|
eventFromEventPusher(
|
||||||
org.NewDomainPolicyAddedEvent(context.Background(),
|
org.NewDomainPolicyAddedEvent(context.Background(),
|
||||||
|
@@ -43,3 +43,7 @@ const (
|
|||||||
func (s OrgState) Valid() bool {
|
func (s OrgState) Valid() bool {
|
||||||
return s > OrgStateUnspecified && s < orgStateMax
|
return s > OrgStateUnspecified && s < orgStateMax
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s OrgState) Exists() bool {
|
||||||
|
return s != OrgStateRemoved && s != OrgStateUnspecified
|
||||||
|
}
|
||||||
|
@@ -196,7 +196,7 @@ Errors:
|
|||||||
AlreadyExists: Екземплярът вече съществува
|
AlreadyExists: Екземплярът вече съществува
|
||||||
NotChanged: Екземплярът не е променен
|
NotChanged: Екземплярът не е променен
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Името на организацията вече е заето
|
AlreadyExists: Името или идентификационният номер на организацията вече е зает.
|
||||||
Invalid: Организацията е невалидна
|
Invalid: Организацията е невалидна
|
||||||
AlreadyDeactivated: Организацията вече е деактивирана
|
AlreadyDeactivated: Организацията вече е деактивирана
|
||||||
AlreadyActive: Организацията вече е активна
|
AlreadyActive: Организацията вече е активна
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Instance již existuje
|
AlreadyExists: Instance již existuje
|
||||||
NotChanged: Instance nezměněna
|
NotChanged: Instance nezměněna
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Název organizace je již obsazen
|
AlreadyExists: Името или идентификационният номер на организацията вече е зает
|
||||||
Invalid: Organizace je neplatná
|
Invalid: Organizace je neplatná
|
||||||
AlreadyDeactivated: Organizace je již deaktivována
|
AlreadyDeactivated: Organizace je již deaktivována
|
||||||
AlreadyActive: Organizace je již aktivní
|
AlreadyActive: Organizace je již aktivní
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Instanz exisitiert bereits
|
AlreadyExists: Instanz exisitiert bereits
|
||||||
NotChanged: Instanz wurde nicht verändert
|
NotChanged: Instanz wurde nicht verändert
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Organisationsname existiert bereits
|
AlreadyExists: Der Name oder die ID der Organisation ist bereits vorhanden
|
||||||
Invalid: Organisation ist ungültig
|
Invalid: Organisation ist ungültig
|
||||||
AlreadyDeactivated: Organisation ist bereits deaktiviert
|
AlreadyDeactivated: Organisation ist bereits deaktiviert
|
||||||
AlreadyActive: Organisation ist bereits aktiv
|
AlreadyActive: Organisation ist bereits aktiv
|
||||||
|
@@ -195,7 +195,7 @@ Errors:
|
|||||||
AlreadyExists: Instance already exists
|
AlreadyExists: Instance already exists
|
||||||
NotChanged: Instance not changed
|
NotChanged: Instance not changed
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Organisation's name already taken
|
AlreadyExists: Organisation's name or id already taken
|
||||||
Invalid: Organisation is invalid
|
Invalid: Organisation is invalid
|
||||||
AlreadyDeactivated: Organisation is already deactivated
|
AlreadyDeactivated: Organisation is already deactivated
|
||||||
AlreadyActive: Organisation is already active
|
AlreadyActive: Organisation is already active
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: La instancia ya existe
|
AlreadyExists: La instancia ya existe
|
||||||
NotChanged: La instancia no ha cambiado
|
NotChanged: La instancia no ha cambiado
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: El nombre de la organización ya está cogido
|
AlreadyExists: El nombre o id de la organización ya está tomado
|
||||||
Invalid: El nombre de la organización no es válido
|
Invalid: El nombre de la organización no es válido
|
||||||
AlreadyDeactivated: La organización ya está desactivada
|
AlreadyDeactivated: La organización ya está desactivada
|
||||||
AlreadyActive: La organización ya está activada
|
AlreadyActive: La organización ya está activada
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: L'instance existe déjà
|
AlreadyExists: L'instance existe déjà
|
||||||
NotChanged: L'instance n'a pas changé
|
NotChanged: L'instance n'a pas changé
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Le nom de l'organisation est déjà pris
|
AlreadyExists: Le nom de l'organisation ou l'identifiant est déjà pris
|
||||||
Invalid: L'organisation n'est pas valide
|
Invalid: L'organisation n'est pas valide
|
||||||
AlreadyDeactivated: L'organisation est déjà désactivée
|
AlreadyDeactivated: L'organisation est déjà désactivée
|
||||||
AlreadyActive: L'organisation est déjà active
|
AlreadyActive: L'organisation est déjà active
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Az instance már létezik
|
AlreadyExists: Az instance már létezik
|
||||||
NotChanged: Az instance nem változott
|
NotChanged: Az instance nem változott
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: A szervezet neve már foglalt
|
AlreadyExists: A szervezet neve vagy azonosítója már foglalt
|
||||||
Invalid: A szervezet érvénytelen
|
Invalid: A szervezet érvénytelen
|
||||||
AlreadyDeactivated: A szervezet már deaktiválva van
|
AlreadyDeactivated: A szervezet már deaktiválva van
|
||||||
AlreadyActive: A szervezet már aktív
|
AlreadyActive: A szervezet már aktív
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Contoh sudah ada
|
AlreadyExists: Contoh sudah ada
|
||||||
NotChanged: Contoh tidak berubah
|
NotChanged: Contoh tidak berubah
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Nama organisasi sudah dipakai
|
AlreadyExists: Nama atau ID organisasi sudah digunakan
|
||||||
Invalid: Organisasi tidak valid
|
Invalid: Organisasi tidak valid
|
||||||
AlreadyDeactivated: Organisasi sudah dinonaktifkan
|
AlreadyDeactivated: Organisasi sudah dinonaktifkan
|
||||||
AlreadyActive: Organisasi sudah aktif
|
AlreadyActive: Organisasi sudah aktif
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: L'istanza esiste già
|
AlreadyExists: L'istanza esiste già
|
||||||
NotChanged: Istanza non modificata
|
NotChanged: Istanza non modificata
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Nome dell'organizzazione già preso
|
AlreadyExists: Nome o ID dell'organizzazione già utilizzato
|
||||||
Invalid: L'organizzazione non è valida
|
Invalid: L'organizzazione non è valida
|
||||||
AlreadyDeactivated: L'organizzazione è già disattivata
|
AlreadyDeactivated: L'organizzazione è già disattivata
|
||||||
AlreadyActive: L'organizzazione è già attiva
|
AlreadyActive: L'organizzazione è già attiva
|
||||||
|
@@ -195,7 +195,7 @@ Errors:
|
|||||||
AlreadyExists: すでに存在するインスタンス
|
AlreadyExists: すでに存在するインスタンス
|
||||||
NotChanged: インスタンスは変更されていません
|
NotChanged: インスタンスは変更されていません
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: 組織の名前はすでに使用されています
|
AlreadyExists: 組織名またはIDはすでに使用されています
|
||||||
Invalid: 無効な組織です
|
Invalid: 無効な組織です
|
||||||
AlreadyDeactivated: 組織はすでに非アクティブです
|
AlreadyDeactivated: 組織はすでに非アクティブです
|
||||||
AlreadyActive: 組織はすでにアクティブです
|
AlreadyActive: 組織はすでにアクティブです
|
||||||
|
@@ -195,7 +195,7 @@ Errors:
|
|||||||
AlreadyExists: 인스턴스가 이미 존재합니다
|
AlreadyExists: 인스턴스가 이미 존재합니다
|
||||||
NotChanged: 인스턴스가 변경되지 않았습니다
|
NotChanged: 인스턴스가 변경되지 않았습니다
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: 조직 이름이 이미 사용 중입니다
|
AlreadyExists: 조직 이름 또는 ID가 이미 사용 중입니다
|
||||||
Invalid: 조직이 유효하지 않습니다
|
Invalid: 조직이 유효하지 않습니다
|
||||||
AlreadyDeactivated: 조직이 이미 비활성화되었습니다
|
AlreadyDeactivated: 조직이 이미 비활성화되었습니다
|
||||||
AlreadyActive: 조직이 이미 활성화되었습니다
|
AlreadyActive: 조직이 이미 활성화되었습니다
|
||||||
|
@@ -193,7 +193,7 @@ Errors:
|
|||||||
AlreadyExists: Инстанцата веќе постои
|
AlreadyExists: Инстанцата веќе постои
|
||||||
NotChanged: Инстанцата не е променета
|
NotChanged: Инстанцата не е променета
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Името на организацијата е веќе зафатено
|
AlreadyExists: Името или ID-то на организацијата е веќе зафатено
|
||||||
Invalid: Организацијата е невалидна
|
Invalid: Организацијата е невалидна
|
||||||
AlreadyDeactivated: Организацијата е веќе деактивирана
|
AlreadyDeactivated: Организацијата е веќе деактивирана
|
||||||
AlreadyActive: Организацијата е веќе активна
|
AlreadyActive: Организацијата е веќе активна
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Instantie bestaat al
|
AlreadyExists: Instantie bestaat al
|
||||||
NotChanged: Instantie is niet veranderd
|
NotChanged: Instantie is niet veranderd
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Organisatienaam is al in gebruik
|
AlreadyExists: Organisatienaam of -id is al in gebruik
|
||||||
Invalid: Organisatie is ongeldig
|
Invalid: Organisatie is ongeldig
|
||||||
AlreadyDeactivated: Organisatie is al gedeactiveerd
|
AlreadyDeactivated: Organisatie is al gedeactiveerd
|
||||||
AlreadyActive: Organisatie is al actief
|
AlreadyActive: Organisatie is al actief
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Instancja już istnieje
|
AlreadyExists: Instancja już istnieje
|
||||||
NotChanged: Instancja nie zmieniona
|
NotChanged: Instancja nie zmieniona
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Nazwa organizacji jest już zajęta
|
AlreadyExists: Nazwa lub identyfikator organizacji jest już zajęty
|
||||||
Invalid: Organizacja jest nieprawidłowa
|
Invalid: Organizacja jest nieprawidłowa
|
||||||
AlreadyDeactivated: Organizacja jest już deaktywowana
|
AlreadyDeactivated: Organizacja jest już deaktywowana
|
||||||
AlreadyActive: Organizacja jest już aktywna
|
AlreadyActive: Organizacja jest już aktywna
|
||||||
|
@@ -193,7 +193,7 @@ Errors:
|
|||||||
AlreadyExists: Instância já existe
|
AlreadyExists: Instância já existe
|
||||||
NotChanged: Instância não alterada
|
NotChanged: Instância não alterada
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Nome da organização já está em uso
|
AlreadyExists: O nome ou ID da organização já está em uso
|
||||||
Invalid: Organização é inválida
|
Invalid: Organização é inválida
|
||||||
AlreadyDeactivated: Organização já está desativada
|
AlreadyDeactivated: Organização já está desativada
|
||||||
AlreadyActive: Organização já está ativa
|
AlreadyActive: Organização já está ativa
|
||||||
|
@@ -195,7 +195,7 @@ Errors:
|
|||||||
AlreadyExists: Instanța există deja
|
AlreadyExists: Instanța există deja
|
||||||
NotChanged: Instanța nu a fost schimbată
|
NotChanged: Instanța nu a fost schimbată
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Numele organizației este deja luat
|
AlreadyExists: Numele sau ID-ul organizației este deja utilizat
|
||||||
Invalid: Organizația este invalidă
|
Invalid: Organizația este invalidă
|
||||||
AlreadyDeactivated: Organizația este deja dezactivată
|
AlreadyDeactivated: Organizația este deja dezactivată
|
||||||
AlreadyActive: Organizația este deja activă
|
AlreadyActive: Organizația este deja activă
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Экземпляр уже существует
|
AlreadyExists: Экземпляр уже существует
|
||||||
NotChanged: Экземпляр не изменён
|
NotChanged: Экземпляр не изменён
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Название организации уже занято
|
AlreadyExists: Название организации или идентификатор уже занят
|
||||||
Invalid: Организация недействительна
|
Invalid: Организация недействительна
|
||||||
AlreadyDeactivated: Организация уже деактивирована
|
AlreadyDeactivated: Организация уже деактивирована
|
||||||
AlreadyActive: Организация уже активна
|
AlreadyActive: Организация уже активна
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: Instans finns redan
|
AlreadyExists: Instans finns redan
|
||||||
NotChanged: Instans ändrades inte
|
NotChanged: Instans ändrades inte
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: Organisationens namn är redan taget
|
AlreadyExists: Organisationens namn eller ID är redan upptaget
|
||||||
Invalid: Organisationen är ogiltigt
|
Invalid: Organisationen är ogiltigt
|
||||||
AlreadyDeactivated: Organisation är redan avaktiverad
|
AlreadyDeactivated: Organisation är redan avaktiverad
|
||||||
AlreadyActive: Organisationen är redan aktiv
|
AlreadyActive: Organisationen är redan aktiv
|
||||||
|
@@ -194,7 +194,7 @@ Errors:
|
|||||||
AlreadyExists: 实例已经存在
|
AlreadyExists: 实例已经存在
|
||||||
NotChanged: 实例没有改变
|
NotChanged: 实例没有改变
|
||||||
Org:
|
Org:
|
||||||
AlreadyExists: 组织名称已被占用
|
AlreadyExists: 该组织名称或 ID 已被占用
|
||||||
Invalid: 组织无效
|
Invalid: 组织无效
|
||||||
AlreadyDeactivated: 组织已停用
|
AlreadyDeactivated: 组织已停用
|
||||||
AlreadyActive: 组织已处于启用状态
|
AlreadyActive: 组织已处于启用状态
|
||||||
|
Reference in New Issue
Block a user