0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-04-14 23:11:31 -05:00

feat(schemas): add captcha policy field (#7106)

This commit is contained in:
wangsijie 2025-03-10 09:11:07 +08:00 committed by GitHub
parent 45b58d369a
commit b0b21cc047
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 36 additions and 1 deletions

View file

@ -103,4 +103,5 @@ export const mockSignInExperience: SignInExperience = {
supportEmail: null,
supportWebsiteUrl: null,
unknownSessionRedirectUrl: null,
captchaPolicy: {},
};

View file

@ -36,12 +36,13 @@ describe('sign-in-experience query', () => {
passwordPolicy: JSON.stringify(mockSignInExperience.passwordPolicy),
mfa: JSON.stringify(mockSignInExperience.mfa),
socialSignIn: JSON.stringify(mockSignInExperience.socialSignIn),
captchaPolicy: JSON.stringify(mockSignInExperience.captchaPolicy),
};
it('findDefaultSignInExperience', async () => {
/* eslint-disable sql/no-unsafe-query */
const expectSql = `
select "tenant_id", "id", "color", "branding", "language_info", "terms_of_use_url", "privacy_policy_url", "agree_to_terms_policy", "sign_in", "sign_up", "social_sign_in", "social_sign_in_connector_targets", "sign_in_mode", "custom_css", "custom_content", "custom_ui_assets", "password_policy", "mfa", "single_sign_on_enabled", "support_email", "support_website_url", "unknown_session_redirect_url"
select "tenant_id", "id", "color", "branding", "language_info", "terms_of_use_url", "privacy_policy_url", "agree_to_terms_policy", "sign_in", "sign_up", "social_sign_in", "social_sign_in_connector_targets", "sign_in_mode", "custom_css", "custom_content", "custom_ui_assets", "password_policy", "mfa", "single_sign_on_enabled", "support_email", "support_website_url", "unknown_session_redirect_url", "captcha_policy"
from "sign_in_experiences"
where "id"=$1
`;

View file

@ -117,6 +117,7 @@ export const mockSignInExperience: SignInExperience = {
supportEmail: null,
supportWebsiteUrl: null,
unknownSessionRedirectUrl: null,
captchaPolicy: {},
};
export const mockSignInExperienceSettings: SignInExperienceResponse = {
@ -155,6 +156,7 @@ export const mockSignInExperienceSettings: SignInExperienceResponse = {
supportEmail: null,
supportWebsiteUrl: null,
unknownSessionRedirectUrl: null,
captchaPolicy: {},
};
const usernameSettings = {

View file

@ -117,6 +117,7 @@ export const mockSignInExperience: SignInExperience = {
supportEmail: null,
supportWebsiteUrl: null,
unknownSessionRedirectUrl: null,
captchaPolicy: {},
};
export const mockSignInExperienceSettings: SignInExperienceResponse = {
@ -155,6 +156,7 @@ export const mockSignInExperienceSettings: SignInExperienceResponse = {
supportEmail: null,
supportWebsiteUrl: null,
unknownSessionRedirectUrl: null,
captchaPolicy: {},
};
const usernameSettings = {

View file

@ -0,0 +1,20 @@
import { sql } from '@silverhand/slonik';
import type { AlterationScript } from '../lib/types/alteration.js';
const alteration: AlterationScript = {
up: async (pool) => {
await pool.query(sql`
alter table sign_in_experiences
add column captcha_policy jsonb not null default '{}'::jsonb;
`);
},
down: async (pool) => {
await pool.query(sql`
alter table sign_in_experiences
drop column captcha_policy;
`);
},
};
export default alteration;

View file

@ -160,3 +160,11 @@ export const customUiAssetsGuard = z.object({
});
export type CustomUiAssets = z.infer<typeof customUiAssetsGuard>;
export const captchaPolicyGuard = z.object({
signIn: z.boolean().optional(),
signUp: z.boolean().optional(),
forgotPassword: z.boolean().optional(),
});
export type CaptchaPolicy = z.infer<typeof captchaPolicyGuard>;

View file

@ -26,5 +26,6 @@ create table sign_in_experiences (
support_email text,
support_website_url text,
unknown_session_redirect_url text,
captcha_policy jsonb /* @use CaptchaPolicy */ not null default '{}'::jsonb,
primary key (tenant_id, id)
);