From e34159feea750938e42f2df060f9c12c008fe219 Mon Sep 17 00:00:00 2001 From: nichenqin <nichenqin@hotmail.com> Date: Fri, 22 Nov 2024 10:06:44 +0800 Subject: [PATCH 1/4] fix: fix button field condition --- .../field-options/button-field-option.svelte | 28 ++++++++++++------- .../blocks/field-options/field-options.svelte | 2 +- .../blocks/update-field/update-field.svelte | 1 + .../variants/button-field/button-field.vo.ts | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/apps/frontend/src/lib/components/blocks/field-options/button-field-option.svelte b/apps/frontend/src/lib/components/blocks/field-options/button-field-option.svelte index bcbdee28f..1e372718b 100644 --- a/apps/frontend/src/lib/components/blocks/field-options/button-field-option.svelte +++ b/apps/frontend/src/lib/components/blocks/field-options/button-field-option.svelte @@ -17,7 +17,7 @@ import { Button } from "$lib/components/ui/button" import Separator from "$lib/components/ui/separator/separator.svelte" import { writable } from "svelte/store" - import type { ZodUndefined } from "@undb/zod" + import { Switch } from "$lib/components/ui/switch" import FiltersEditor from "../filters-editor/filters-editor.svelte" import { onMount, tick } from "svelte" @@ -40,15 +40,18 @@ confirm: true, }, } - const value = writable<MaybeConditionGroup<ZodUndefined> | undefined>() + const value = writable<MaybeConditionGroup<any> | undefined>() $: validValue = $table && $value ? parseValidViewFilter($table.schema, $value) : undefined $: if (validValue) { option.disabled = validValue } + let disabledWhen = false + onMount(() => { if (option.disabled) { value.set(toMaybeConditionGroup(option.disabled)) + disabledWhen = true } }) @@ -63,14 +66,19 @@ <Label for="label">Label</Label> <Input class="w-full" placeholder="Button" id="label" bind:value={option.label} /> - <div class="space-y-2 rounded-sm border pt-2"> - <Label class="pl-4 text-xs font-semibold" for="disabled">Disabled When...</Label> - <FiltersEditor - bind:value={$value} - table={$table} - filter={(field) => visibleFields.some((f) => f.id.value === field.id) && getIsFilterableFieldType(field.type)} - ></FiltersEditor> - </div> + <Label class="flex items-center gap-2 text-xs font-semibold" for="disabled"> + <Switch id="disabled" bind:checked={disabledWhen} size="sm" /> + Disabled When... + </Label> + {#if disabledWhen} + <div class="space-y-2 rounded-sm border pt-2"> + <FiltersEditor + bind:value={$value} + table={$table} + filter={(field) => visibleFields.some((f) => f.id.value === field.id) && getIsFilterableFieldType(field.type)} + ></FiltersEditor> + </div> + {/if} <div class="space-y-2 rounded-md border px-4 py-3"> <p class="text-xs font-semibold">Update Value when Click Button</p> diff --git a/apps/frontend/src/lib/components/blocks/field-options/field-options.svelte b/apps/frontend/src/lib/components/blocks/field-options/field-options.svelte index c9dc08376..f11882c66 100644 --- a/apps/frontend/src/lib/components/blocks/field-options/field-options.svelte +++ b/apps/frontend/src/lib/components/blocks/field-options/field-options.svelte @@ -31,7 +31,6 @@ export let disabled = false export let type: NoneSystemFieldType - const map: Record<NoneSystemFieldType, ComponentType> = { string: StringFieldOption, longText: LongTextFieldOption, @@ -67,4 +66,5 @@ bind:option {isNew} {field} + {...$$restProps} /> diff --git a/apps/frontend/src/lib/components/blocks/update-field/update-field.svelte b/apps/frontend/src/lib/components/blocks/update-field/update-field.svelte index b4ece9396..c7f407735 100644 --- a/apps/frontend/src/lib/components/blocks/update-field/update-field.svelte +++ b/apps/frontend/src/lib/components/blocks/update-field/update-field.svelte @@ -113,6 +113,7 @@ bind:constraint={$formData.constraint} bind:display={$formData.display} bind:defaultValue={$formData.defaultValue} + {...attrs} /> </Form.Control> <Form.Description /> diff --git a/packages/table/src/modules/schema/fields/variants/button-field/button-field.vo.ts b/packages/table/src/modules/schema/fields/variants/button-field/button-field.vo.ts index 8e9c5d4cf..ff7fa49e6 100644 --- a/packages/table/src/modules/schema/fields/variants/button-field/button-field.vo.ts +++ b/packages/table/src/modules/schema/fields/variants/button-field/button-field.vo.ts @@ -24,7 +24,7 @@ export const buttonFieldUpdateAction = z.object({ confirm: z.boolean().optional(), }) -const buttonCondition = z.undefined() +const buttonCondition = z.any() export const buttonDisabled = createConditionGroup(buttonCondition, buttonCondition) export type IButtonDisabled = z.infer<typeof buttonDisabled> From 6b0d7728a67f4e951e7b6734990979dacbc77755 Mon Sep 17 00:00:00 2001 From: nichenqin <nichenqin@hotmail.com> Date: Sun, 24 Nov 2024 10:13:49 +0800 Subject: [PATCH 2/4] chore: create admin after migrate --- apps/backend/src/app.ts | 8 ++- apps/backend/src/modules/auth/auth.ts | 100 +++++++++++++------------- 2 files changed, 57 insertions(+), 51 deletions(-) diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index 546fa5dc5..f5eb781f3 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -35,9 +35,14 @@ const openapi = container.resolve(OpenAPI) const opentelemetry = container.resolve(OpenTelemetryModule) const template = container.resolve(TemplateModule) +const logger = createLogger("app") + export const app = new Elysia() - .onStart(async () => { + .on("start", async () => { + logger.info("db migrate start") await dbMigrate() + logger.info("db migrate done") + await auth.onStart() }) .use(opentelemetry.plugin()) .use(loggerPlugin()) @@ -64,7 +69,6 @@ export const app = new Elysia() set.headers["Server-Timing"] = `handle;dur=${(await end) - begin}` }) .onStart(async () => { - const logger = createLogger("app onstart") const pubsub = container.resolve(PubSubContext) const webhookEventHandler = container.resolve(WebhookEventsHandler) // const auditEventHandler = container.resolve(AuditEventHandler) diff --git a/apps/backend/src/modules/auth/auth.ts b/apps/backend/src/modules/auth/auth.ts index f4a9d3e6b..fec1120fd 100644 --- a/apps/backend/src/modules/auth/auth.ts +++ b/apps/backend/src/modules/auth/auth.ts @@ -173,62 +173,64 @@ export class Auth { } } - route() { - const oauth = container.resolve(OAuth) - return new Elysia() - .use(oauth.route()) - .onStart(async (ctx) => { - const adminEmail = env.UNDB_ADMIN_EMAIL - const adminPassword = env.UNDB_ADMIN_PASSWORD - if (env.UNDB_DISABLE_REGISTRATION) { - this.logger.info("Registration is disabled") - if (!adminEmail || !adminPassword) { - const message = - "Registration is disabled but admin user is not set, please set UNDB_ADMIN_EMAIL and UNDB_ADMIN_PASSWORD environment variables" - this.logger.fatal(message) - throw new Error(message) - } + async onStart() { + const adminEmail = env.UNDB_ADMIN_EMAIL + const adminPassword = env.UNDB_ADMIN_PASSWORD + if (env.UNDB_DISABLE_REGISTRATION) { + this.logger.info("Registration is disabled") + if (!adminEmail || !adminPassword) { + const message = + "Registration is disabled but admin user is not set, please set UNDB_ADMIN_EMAIL and UNDB_ADMIN_PASSWORD environment variables" + this.logger.fatal(message) + throw new Error(message) + } - const user = await this.queryBuilder - .selectFrom("undb_user") - .selectAll() - .where((eb) => eb.eb("email", "=", adminEmail)) - .executeTakeFirst() + const user = await this.queryBuilder + .selectFrom("undb_user") + .selectAll() + .where((eb) => eb.eb("email", "=", adminEmail)) + .executeTakeFirst() - if (!user) { - const userId = generateIdFromEntropySize(10) // 16 characters long - const passwordHash = await Bun.password.hash(adminPassword) - const username = getUsernameFromEmail(adminEmail) + if (!user) { + this.logger.info("Admin user not found, creating...") + const userId = generateIdFromEntropySize(10) // 16 characters long + const passwordHash = await Bun.password.hash(adminPassword) + const username = getUsernameFromEmail(adminEmail) + + executionContext.enterWith({ + requestId: v7(), + user: { + userId, + username, + email: adminEmail, + }, + }) - executionContext.enterWith({ - requestId: v7(), - user: { - userId, - username, - email: adminEmail, - }, + await withTransaction(this.queryBuilder)(async () => { + await getCurrentTransaction() + .insertInto("undb_user") + .values({ + email: adminEmail, + username: username!, + id: userId, + password: passwordHash, + email_verified: true, }) + .execute() - await withTransaction(this.queryBuilder)(async () => { - await getCurrentTransaction() - .insertInto("undb_user") - .values({ - email: adminEmail, - username: username!, - id: userId, - password: passwordHash, - email_verified: true, - }) - .execute() + const space = await this.spaceService.createSpace({ name: username! }) + await this.spaceMemberService.createMember(userId, space.id.value, "owner") - const space = await this.spaceService.createSpace({ name: username! }) - await this.spaceMemberService.createMember(userId, space.id.value, "owner") + this.logger.info("Admin user created") + }) + } + } + } - this.logger.info("Admin user created") - }) - } - } - }) + route() { + const oauth = container.resolve(OAuth) + return new Elysia() + .use(oauth.route()) .onAfterResponse((ctx) => { const requestId = executionContext.getStore()?.requestId this.logger.info( From 8decb419cf8b34cb9ade4dfa9149204d868734b9 Mon Sep 17 00:00:00 2001 From: nichenqin <nichenqin@hotmail.com> Date: Sun, 24 Nov 2024 10:22:45 +0800 Subject: [PATCH 3/4] chore: add logging --- bun.lockb | Bin 587728 -> 587760 bytes .../src/space-member/space-member.service.ts | 4 ++++ packages/space/package.json | 1 + packages/space/src/space.service.ts | 3 +++ 4 files changed, 8 insertions(+) diff --git a/bun.lockb b/bun.lockb index 78cc6c3cb2164213a4fac23a3de932c93071e6b0..70c699479dd8b51f50c0774f32ff1ca307b0a48d 100755 GIT binary patch delta 29802 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 CTIKfu delta 30041 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%0DqBF?X;3BvLz5(9@UHbo^8;GAs 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 diff --git a/packages/authz/src/space-member/space-member.service.ts b/packages/authz/src/space-member/space-member.service.ts index 050cac7b6..80407ec0a 100644 --- a/packages/authz/src/space-member/space-member.service.ts +++ b/packages/authz/src/space-member/space-member.service.ts @@ -1,5 +1,6 @@ import { inject, singleton } from "@undb/di" import { and, None, Option } from "@undb/domain" +import { createLogger } from "@undb/logger" import { injectSpaceService, type ISpaceId, type ISpaceService } from "@undb/space" import type { SetContextValue } from "../../../context/src/context.type" import { MemberIdVO } from "../member/member-id.vo" @@ -32,6 +33,7 @@ export const injectSpaceMemberService = () => inject(SPACE_MEMBER_SERVICE) @singleton() export class SpaceMemberService implements ISpaceMemberService { + private logger = createLogger("SpaceMemberService") constructor( @injectSpaceService() private readonly spaceService: ISpaceService, @@ -110,6 +112,8 @@ export class SpaceMemberService implements ISpaceMemberService { spaceId: ISpaceId, userId: string, ): Promise<Option<SpaceMember>> { + this.logger.debug({ spaceId, userId }, "setSpaceMemberContext") + if (!spaceId || !userId) { return None } diff --git a/packages/space/package.json b/packages/space/package.json index 21dbc80e5..f61fbdee2 100644 --- a/packages/space/package.json +++ b/packages/space/package.json @@ -5,6 +5,7 @@ "types": "src/index.d.ts", "dependencies": { "@undb/context": "workspace:*", + "@undb/logger": "workspace:*", "ts-pattern": "^5.5.0" }, "devDependencies": { diff --git a/packages/space/src/space.service.ts b/packages/space/src/space.service.ts index 6a9d1f106..df0e9a456 100644 --- a/packages/space/src/space.service.ts +++ b/packages/space/src/space.service.ts @@ -1,5 +1,6 @@ import type { SetContextValue } from "@undb/context" import { inject, singleton } from "@undb/di" +import { createLogger } from "@undb/logger" import { None, Option, Some } from "oxide.ts" import { match, P } from "ts-pattern" import type { ICreateSpaceDTO, ISpaceDTO } from "./dto" @@ -37,6 +38,7 @@ export const injectSpaceService = () => inject(SPACE_SERVICE) @singleton() export class SpaceService implements ISpaceService { + private logger = createLogger("SpaceService") constructor( @injectSpaceRepository() private readonly spaceRepository: ISpaceRepository, @@ -86,6 +88,7 @@ export class SpaceService implements ISpaceService { } async setSpaceContext(setContext: SetContextValue, input: IGetSpaceInput): Promise<Space> { + this.logger.debug(input, "setSpaceContext") const space = await this.getSpace(input) setContext("spaceId", space.unwrap().id.value) From 51a7c950d3c9a1821b2b291796a94b8bd085df30 Mon Sep 17 00:00:00 2001 From: GitHub actions <noreply@github.com> Date: Sun, 24 Nov 2024 02:24:36 +0000 Subject: [PATCH 4/4] Prepare release v1.0.0-127 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd62a357..4ec6be853 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## v1.0.0-127 + + +### 🏡 Chore + +- Add logging ([8decb41](https://github.com/undb-io/undb/commit/8decb41)) + +### ❤️ Contributors + +- Nichenqin ([@nichenqin](http://github.com/nichenqin)) + ## v1.0.0-126 diff --git a/package.json b/package.json index b976babc3..1576d127e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "undb", - "version": "1.0.0-126", + "version": "1.0.0-127", "private": true, "scripts": { "build": "NODE_ENV=production bun --bun turbo build",