diff --git a/packages/core/src/__mocks__/sign-in-experience.ts b/packages/core/src/__mocks__/sign-in-experience.ts index 6e92ec63a651..3259fc10a7b7 100644 --- a/packages/core/src/__mocks__/sign-in-experience.ts +++ b/packages/core/src/__mocks__/sign-in-experience.ts @@ -6,7 +6,7 @@ import type { SignUp, SignIn, } from '@logto/schemas'; -import { SignInMode, SignInIdentifier, MfaPolicy } from '@logto/schemas'; +import { SignInMode, SignInIdentifier, MfaPolicy, AgreeToTermsPolicy } from '@logto/schemas'; export const mockColor: Color = { primaryColor: '#000', @@ -91,6 +91,7 @@ export const mockSignInExperience: SignInExperience = { signInMode: SignInMode.SignInAndRegister, customCss: null, customContent: {}, + agreeToTermsPolicy: AgreeToTermsPolicy.AutoAgree, passwordPolicy: {}, mfa: { policy: MfaPolicy.UserControlled, diff --git a/packages/experience/src/__mocks__/logto.tsx b/packages/experience/src/__mocks__/logto.tsx index ec3b66d09d85..f079d680b318 100644 --- a/packages/experience/src/__mocks__/logto.tsx +++ b/packages/experience/src/__mocks__/logto.tsx @@ -1,5 +1,6 @@ import type { SignInExperience, SignIn, SsoConnectorMetadata } from '@logto/schemas'; import { + AgreeToTermsPolicy, ConnectorPlatform, ConnectorType, MfaPolicy, @@ -104,6 +105,7 @@ export const mockSignInExperience: SignInExperience = { signInMode: SignInMode.SignInAndRegister, customCss: null, customContent: {}, + agreeToTermsPolicy: AgreeToTermsPolicy.AutoAgree, passwordPolicy: {}, mfa: { policy: MfaPolicy.UserControlled, @@ -136,6 +138,7 @@ export const mockSignInExperienceSettings: SignInExperienceResponse = { }, customCss: null, customContent: {}, + agreeToTermsPolicy: AgreeToTermsPolicy.AutoAgree, passwordPolicy: {}, mfa: { policy: MfaPolicy.UserControlled, diff --git a/packages/schemas/alterations/next-1718594164-add-agree-to-terms-policy.ts b/packages/schemas/alterations/next-1718594164-add-agree-to-terms-policy.ts new file mode 100644 index 000000000000..d9ba7531774d --- /dev/null +++ b/packages/schemas/alterations/next-1718594164-add-agree-to-terms-policy.ts @@ -0,0 +1,40 @@ +import { yes } from '@silverhand/essentials'; +import { sql } from '@silverhand/slonik'; + +import type { AlterationScript } from '../lib/types/alteration.js'; + +const isCi = yes(process.env.CI); + +const alteration: AlterationScript = { + up: async (pool) => { + // Create type + await pool.query(sql` + create type agree_to_terms_policy as enum ('AutoAgree', 'RegistrationOnly', 'RegistrationAndSignIn'); + `); + + if (isCi) { + // Direct set default to 'AutoAgree' to align with the sql table definition + await pool.query(sql` + alter table sign_in_experiences add column agree_to_terms_policy agree_to_terms_policy not null default 'AutoAgree'; + `); + } else { + // For compatibility with existing data, default to 'RegistrationOnly' + await pool.query(sql` + alter table sign_in_experiences add column agree_to_terms_policy agree_to_terms_policy not null default 'RegistrationOnly'; + `); + + // For new data, default to 'AutoAgree' + await pool.query(sql` + alter table sign_in_experiences alter column agree_to_terms_policy set default 'AutoAgree'; + `); + } + }, + down: async (pool) => { + await pool.query(sql` + alter table sign_in_experiences drop column agree_to_terms_policy; + drop type agree_to_terms_policy; + `); + }, +}; + +export default alteration; diff --git a/packages/schemas/tables/sign_in_experiences.sql b/packages/schemas/tables/sign_in_experiences.sql index 21594b0c6ebc..3df42f2d2737 100644 --- a/packages/schemas/tables/sign_in_experiences.sql +++ b/packages/schemas/tables/sign_in_experiences.sql @@ -1,4 +1,5 @@ create type sign_in_mode as enum ('SignIn', 'Register', 'SignInAndRegister'); +create type agree_to_terms_policy as enum ('AutoAgree', 'RegistrationOnly', 'RegistrationAndSignIn'); create table sign_in_experiences ( tenant_id varchar(21) not null @@ -9,6 +10,7 @@ create table sign_in_experiences ( language_info jsonb /* @use LanguageInfo */ not null, terms_of_use_url varchar(2048), privacy_policy_url varchar(2048), + agree_to_terms_policy agree_to_terms_policy not null default 'AutoAgree', sign_in jsonb /* @use SignIn */ not null, sign_up jsonb /* @use SignUp */ not null, social_sign_in jsonb /* @use SocialSignIn */ not null default '{}'::jsonb,