From e1b799eac2378ed0002ba71b7b085ad56ab3ce69 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Thu, 15 Aug 2024 22:46:58 +0800 Subject: [PATCH 1/3] fix: fix invitation --- apps/backend/drizzle/0002_fixed_lockjaw.sql | 2 + apps/backend/drizzle/meta/0002_snapshot.json | 1796 +++++++++++++++++ apps/backend/drizzle/meta/_journal.json | 7 + apps/backend/package.json | 2 + apps/backend/src/modules/mail/mail.ts | 39 +- bun.lockb | Bin 573880 -> 579072 bytes .../src/space-member/space-member.service.ts | 4 +- packages/env/src/index.ts | 3 + packages/persistence/src/tables.ts | 3 +- 9 files changed, 1842 insertions(+), 14 deletions(-) create mode 100644 apps/backend/drizzle/0002_fixed_lockjaw.sql create mode 100644 apps/backend/drizzle/meta/0002_snapshot.json diff --git a/apps/backend/drizzle/0002_fixed_lockjaw.sql b/apps/backend/drizzle/0002_fixed_lockjaw.sql new file mode 100644 index 000000000..a13a77fc1 --- /dev/null +++ b/apps/backend/drizzle/0002_fixed_lockjaw.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS `undb_invitation_email_unique`;--> statement-breakpoint +CREATE UNIQUE INDEX `invitation_unique_idx` ON `undb_invitation` (`email`,`space_id`); \ No newline at end of file diff --git a/apps/backend/drizzle/meta/0002_snapshot.json b/apps/backend/drizzle/meta/0002_snapshot.json new file mode 100644 index 000000000..e53fcb061 --- /dev/null +++ b/apps/backend/drizzle/meta/0002_snapshot.json @@ -0,0 +1,1796 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "6f6c207c-336b-486f-8a37-c44c56a85fb6", + "prevId": "647dbce1-ba47-4cc7-bfdf-f950d08a3aba", + "tables": { + "undb_api_token": { + "name": "undb_api_token", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "undb_api_token_user_id_unique": { + "name": "undb_api_token_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "undb_api_token_token_unique": { + "name": "undb_api_token_token_unique", + "columns": [ + "token" + ], + "isUnique": true + }, + "api_token_space_id_idx": { + "name": "api_token_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "api_token_user_id_idx": { + "name": "api_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_api_token_user_id_undb_user_id_fk": { + "name": "undb_api_token_user_id_undb_user_id_fk", + "tableFrom": "undb_api_token", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_api_token_space_id_undb_space_id_fk": { + "name": "undb_api_token_space_id_undb_space_id_fk", + "tableFrom": "undb_api_token", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_attachment_mapping": { + "name": "undb_attachment_mapping", + "columns": { + "attachment_id": { + "name": "attachment_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "record_id": { + "name": "record_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "field_id": { + "name": "field_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "undb_attachment_mapping_attachment_id_undb_attachment_id_fk": { + "name": "undb_attachment_mapping_attachment_id_undb_attachment_id_fk", + "tableFrom": "undb_attachment_mapping", + "tableTo": "undb_attachment", + "columnsFrom": [ + "attachment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_attachment_mapping_table_id_undb_table_id_fk": { + "name": "undb_attachment_mapping_table_id_undb_table_id_fk", + "tableFrom": "undb_attachment_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "undb_attachment_mapping_attachment_id_table_id_record_id_field_id_pk": { + "columns": [ + "attachment_id", + "table_id", + "record_id", + "field_id" + ], + "name": "undb_attachment_mapping_attachment_id_table_id_record_id_field_id_pk" + } + }, + "uniqueConstraints": {} + }, + "undb_attachment": { + "name": "undb_attachment", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size": { + "name": "size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "attachment_size_idx": { + "name": "attachment_size_idx", + "columns": [ + "size" + ], + "isUnique": false + }, + "attachment_space_id_idx": { + "name": "attachment_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_attachment_created_by_undb_user_id_fk": { + "name": "undb_attachment_created_by_undb_user_id_fk", + "tableFrom": "undb_attachment", + "tableTo": "undb_user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_attachment_space_id_undb_space_id_fk": { + "name": "undb_attachment_space_id_undb_space_id_fk", + "tableFrom": "undb_attachment", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_audit": { + "name": "undb_audit", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "detail": { + "name": "detail", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "meta": { + "name": "meta", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "op": { + "name": "op", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "record_id": { + "name": "record_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "operator_id": { + "name": "operator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "audit_table_id_idx": { + "name": "audit_table_id_idx", + "columns": [ + "table_id" + ], + "isUnique": false + }, + "audit_space_id_idx": { + "name": "audit_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "audit_record_id_idx": { + "name": "audit_record_id_idx", + "columns": [ + "record_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_audit_space_id_undb_space_id_fk": { + "name": "undb_audit_space_id_undb_space_id_fk", + "tableFrom": "undb_audit", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_base": { + "name": "undb_base", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_by": { + "name": "updated_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "base_space_id_idx": { + "name": "base_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "base_name_unique_idx": { + "name": "base_name_unique_idx", + "columns": [ + "name", + "space_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_base_space_id_undb_space_id_fk": { + "name": "undb_base_space_id_undb_space_id_fk", + "tableFrom": "undb_base", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_base_created_by_undb_user_id_fk": { + "name": "undb_base_created_by_undb_user_id_fk", + "tableFrom": "undb_base", + "tableTo": "undb_user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_base_updated_by_undb_user_id_fk": { + "name": "undb_base_updated_by_undb_user_id_fk", + "tableFrom": "undb_base", + "tableTo": "undb_user", + "columnsFrom": [ + "updated_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_email_verification_code": { + "name": "undb_email_verification_code", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "code": { + "name": "code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "undb_email_verification_code_user_id_unique": { + "name": "undb_email_verification_code_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_email_verification_code_user_id_undb_user_id_fk": { + "name": "undb_email_verification_code_user_id_undb_user_id_fk", + "tableFrom": "undb_email_verification_code", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_invitation": { + "name": "undb_invitation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invited_at": { + "name": "invited_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "invitation_space_id_idx": { + "name": "invitation_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "invitation_unique_idx": { + "name": "invitation_unique_idx", + "columns": [ + "email", + "space_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_invitation_space_id_undb_space_id_fk": { + "name": "undb_invitation_space_id_undb_space_id_fk", + "tableFrom": "undb_invitation", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_invitation_inviter_id_undb_user_id_fk": { + "name": "undb_invitation_inviter_id_undb_user_id_fk", + "tableFrom": "undb_invitation", + "tableTo": "undb_user", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_oauth_account": { + "name": "undb_oauth_account", + "columns": { + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_user_id": { + "name": "provider_user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "undb_oauth_account_user_id_undb_user_id_fk": { + "name": "undb_oauth_account_user_id_undb_user_id_fk", + "tableFrom": "undb_oauth_account", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "undb_oauth_account_provider_id_provider_user_id_pk": { + "columns": [ + "provider_id", + "provider_user_id" + ], + "name": "undb_oauth_account_provider_id_provider_user_id_pk" + } + }, + "uniqueConstraints": {} + }, + "undb_outbox": { + "name": "undb_outbox", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "meta": { + "name": "meta", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "operator_id": { + "name": "operator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "outbox_space_id_idx": { + "name": "outbox_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_outbox_space_id_undb_space_id_fk": { + "name": "undb_outbox_space_id_undb_space_id_fk", + "tableFrom": "undb_outbox", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_password_reset_token": { + "name": "undb_password_reset_token", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "undb_password_reset_token_token_unique": { + "name": "undb_password_reset_token_token_unique", + "columns": [ + "token" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_password_reset_token_user_id_undb_user_id_fk": { + "name": "undb_password_reset_token_user_id_undb_user_id_fk", + "tableFrom": "undb_password_reset_token", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_reference_id_mapping": { + "name": "undb_reference_id_mapping", + "columns": { + "field_id": { + "name": "field_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "symmetric_field_id": { + "name": "symmetric_field_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "foreign_table_id": { + "name": "foreign_table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "reference_id_mapping_unique_idx": { + "name": "reference_id_mapping_unique_idx", + "columns": [ + "field_id", + "table_id", + "symmetric_field_id", + "foreign_table_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_reference_id_mapping_table_id_undb_table_id_fk": { + "name": "undb_reference_id_mapping_table_id_undb_table_id_fk", + "tableFrom": "undb_reference_id_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_reference_id_mapping_foreign_table_id_undb_table_id_fk": { + "name": "undb_reference_id_mapping_foreign_table_id_undb_table_id_fk", + "tableFrom": "undb_reference_id_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "foreign_table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_rollup_id_mapping": { + "name": "undb_rollup_id_mapping", + "columns": { + "field_id": { + "name": "field_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rollup_id": { + "name": "rollup_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rollup_table_id": { + "name": "rollup_table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "undb_rollup_id_mapping_table_id_undb_table_id_fk": { + "name": "undb_rollup_id_mapping_table_id_undb_table_id_fk", + "tableFrom": "undb_rollup_id_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_rollup_id_mapping_rollup_table_id_undb_table_id_fk": { + "name": "undb_rollup_id_mapping_rollup_table_id_undb_table_id_fk", + "tableFrom": "undb_rollup_id_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "rollup_table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "undb_rollup_id_mapping_field_id_rollup_id_pk": { + "columns": [ + "field_id", + "rollup_id" + ], + "name": "undb_rollup_id_mapping_field_id_rollup_id_pk" + } + }, + "uniqueConstraints": {} + }, + "undb_session": { + "name": "undb_session", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "undb_session_user_id_undb_user_id_fk": { + "name": "undb_session_user_id_undb_user_id_fk", + "tableFrom": "undb_session", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_session_space_id_undb_space_id_fk": { + "name": "undb_session_space_id_undb_space_id_fk", + "tableFrom": "undb_session", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_share": { + "name": "undb_share", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "share_space_id_idx": { + "name": "share_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "share_unique_idx": { + "name": "share_unique_idx", + "columns": [ + "target_type", + "target_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_share_space_id_undb_space_id_fk": { + "name": "undb_share_space_id_undb_space_id_fk", + "tableFrom": "undb_share", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_space": { + "name": "undb_space", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_personal": { + "name": "is_personal", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar": { + "name": "avatar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_by": { + "name": "updated_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "deleted_by": { + "name": "deleted_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "space_name_idx": { + "name": "space_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_space_created_by_undb_user_id_fk": { + "name": "undb_space_created_by_undb_user_id_fk", + "tableFrom": "undb_space", + "tableTo": "undb_user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_space_updated_by_undb_user_id_fk": { + "name": "undb_space_updated_by_undb_user_id_fk", + "tableFrom": "undb_space", + "tableTo": "undb_user", + "columnsFrom": [ + "updated_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_space_deleted_by_undb_user_id_fk": { + "name": "undb_space_deleted_by_undb_user_id_fk", + "tableFrom": "undb_space", + "tableTo": "undb_user", + "columnsFrom": [ + "deleted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_space_member": { + "name": "undb_space_member", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "space_member_unique_idx": { + "name": "space_member_unique_idx", + "columns": [ + "user_id", + "space_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_space_member_user_id_undb_user_id_fk": { + "name": "undb_space_member_user_id_undb_user_id_fk", + "tableFrom": "undb_space_member", + "tableTo": "undb_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_space_member_space_id_undb_space_id_fk": { + "name": "undb_space_member_space_id_undb_space_id_fk", + "tableFrom": "undb_space_member", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_table_id_mapping": { + "name": "undb_table_id_mapping", + "columns": { + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject_id": { + "name": "subject_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "undb_table_id_mapping_table_id_undb_table_id_fk": { + "name": "undb_table_id_mapping_table_id_undb_table_id_fk", + "tableFrom": "undb_table_id_mapping", + "tableTo": "undb_table", + "columnsFrom": [ + "table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "undb_table_id_mapping_table_id_subject_id_pk": { + "columns": [ + "table_id", + "subject_id" + ], + "name": "undb_table_id_mapping_table_id_subject_id_pk" + } + }, + "uniqueConstraints": {} + }, + "undb_table": { + "name": "undb_table", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "base_id": { + "name": "base_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "schema": { + "name": "schema", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "forms": { + "name": "forms", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rls": { + "name": "rls", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_by": { + "name": "updated_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "table_base_id_idx": { + "name": "table_base_id_idx", + "columns": [ + "base_id" + ], + "isUnique": false + }, + "table_space_id_idx": { + "name": "table_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "table_name_unique_idx": { + "name": "table_name_unique_idx", + "columns": [ + "name", + "base_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "undb_table_base_id_undb_base_id_fk": { + "name": "undb_table_base_id_undb_base_id_fk", + "tableFrom": "undb_table", + "tableTo": "undb_base", + "columnsFrom": [ + "base_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_table_space_id_undb_space_id_fk": { + "name": "undb_table_space_id_undb_space_id_fk", + "tableFrom": "undb_table", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_table_created_by_undb_user_id_fk": { + "name": "undb_table_created_by_undb_user_id_fk", + "tableFrom": "undb_table", + "tableTo": "undb_user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_table_updated_by_undb_user_id_fk": { + "name": "undb_table_updated_by_undb_user_id_fk", + "tableFrom": "undb_table", + "tableTo": "undb_user", + "columnsFrom": [ + "updated_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_user": { + "name": "undb_user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar": { + "name": "avatar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "undb_user_email_unique": { + "name": "undb_user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "undb_webhook": { + "name": "undb_webhook", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "method": { + "name": "method", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "headers": { + "name": "headers", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "condition": { + "name": "condition", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "event": { + "name": "event", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "space_id": { + "name": "space_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "webhook_table_id_idx": { + "name": "webhook_table_id_idx", + "columns": [ + "table_id" + ], + "isUnique": false + }, + "webhook_space_id_idx": { + "name": "webhook_space_id_idx", + "columns": [ + "space_id" + ], + "isUnique": false + }, + "webhook_url_idx": { + "name": "webhook_url_idx", + "columns": [ + "url" + ], + "isUnique": false + } + }, + "foreignKeys": { + "undb_webhook_table_id_undb_table_id_fk": { + "name": "undb_webhook_table_id_undb_table_id_fk", + "tableFrom": "undb_webhook", + "tableTo": "undb_table", + "columnsFrom": [ + "table_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "undb_webhook_space_id_undb_space_id_fk": { + "name": "undb_webhook_space_id_undb_space_id_fk", + "tableFrom": "undb_webhook", + "tableTo": "undb_space", + "columnsFrom": [ + "space_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/apps/backend/drizzle/meta/_journal.json b/apps/backend/drizzle/meta/_journal.json index edc7e63f5..9de325ad8 100644 --- a/apps/backend/drizzle/meta/_journal.json +++ b/apps/backend/drizzle/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1723706193281, "tag": "0001_familiar_joshua_kane", "breakpoints": true + }, + { + "idx": 2, + "version": "6", + "when": 1723731591583, + "tag": "0002_fixed_lockjaw", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index b1cdc9a1d..2e85f4ced 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -48,6 +48,7 @@ "minio": "^8.0.1", "nanoid": "^5.0.7", "nodemailer": "^6.9.14", + "nodemailer-mailgun-transport": "^2.1.5", "oslo": "^1.2.1", "radash": "^12.1.0", "reflect-metadata": "^0.2.2", @@ -56,6 +57,7 @@ }, "devDependencies": { "@types/nodemailer": "^6.4.15", + "@types/nodemailer-mailgun-transport": "^1.4.6", "@types/uuid": "^10.0.0", "bun-types": "latest", "kysely": "^0.27.4" diff --git a/apps/backend/src/modules/mail/mail.ts b/apps/backend/src/modules/mail/mail.ts index d709c6d0d..5dc63956a 100644 --- a/apps/backend/src/modules/mail/mail.ts +++ b/apps/backend/src/modules/mail/mail.ts @@ -3,19 +3,35 @@ import { env } from "@undb/env" import { createLogger } from "@undb/logger" import { IMailService, ISendInput } from "@undb/mail" import { createTransport } from "nodemailer" +import mg from "nodemailer-mailgun-transport" +import SMTPConnection from "nodemailer/lib/smtp-connection" import { compile } from "./templates/compile" function createMailerTransport() { - return createTransport({ - host: env.UNDB_MAIL_HOST, - port: env.UNDB_MAIL_PORT ? parseInt(env.UNDB_MAIL_PORT, 10) : undefined, - secure: env.UNDB_MAIL_SECURE, - auth: { - user: env.UNDB_MAIL_USER, - pass: env.UNDB_MAIL_PASS, - }, - debug: Bun.env.NODE_ENV !== "production", - }) + if (env.UNDB_MAIL_PROVIDER === "nodemailer" || !env.UNDB_MAIL_PROVIDER) { + const options: SMTPConnection.Options = { + host: env.UNDB_MAIL_HOST, + port: 465, + // port: env.UNDB_MAIL_PORT ? parseInt(env.UNDB_MAIL_PORT, 10) : undefined, + secure: env.UNDB_MAIL_SECURE, + auth: { + user: env.UNDB_MAIL_USER, + pass: env.UNDB_MAIL_PASS, + }, + debug: Bun.env.NODE_ENV !== "production", + } + + return createTransport(options) + } + + return createTransport( + mg({ + auth: { + api_key: env.UNDB_MAILGUN_API_KEY!, + domain: env.UNDB_MAILGUN_DOMAIN!, + }, + }), + ) } @singleton() @@ -24,11 +40,12 @@ export class NodemailerService implements IMailService { private readonly transport = createMailerTransport() async send(input: ISendInput): Promise { + const html = await compile(input.template, input.data) await this.transport.sendMail({ from: input.from || env.UNDB_MAIL_DEFAULT_FROM, to: input.to, subject: input.subject, - html: await compile(input.template, input.data), + html, }) } } diff --git a/bun.lockb b/bun.lockb index 24549dce61bfcdf5fae909e56901ba548afc8381..2dcc5e87568e4660ae40b30f2de93b7b2e98db8c 100755 GIT binary patch delta 37797 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 delta 34890 zcmeHw33N@@`}Vn4?#;c_R8&G@s8Wg`hD2kY)!dqbAT=e3m_mX`6g7_*Z-O9(im9j) zT2xzOTXQMe7^;J@rPUTK{hsHXy^}P59e)4y{nq-{w|bY?v)^a${qDWr{qB9vJvqrv z+*oGk#4>XOD!dfX|J7ju>(bC`!fL;+;2ABuPayP46_z95ZHv|0*BO!6Vl}H>3WW}yPKVUszG2m6z z!Gd+I4&JR}89D`|p>!ZSo(yFDQ9w4_8OVlfDJ%+P`G+B9!-*LtCK!qDA;F5PfNXdg zkPWXx!?}S`kwYS*;fdI&!GQzelJbo$enfaISi`v1$nr=A_`)b3Gcs~8`Nd6aMnULB znp&P42+RY0K=jbQ%)bgfZvu#rW;VkO3{==ZdU)l2;e8_RKxc)gP>}hPo7;>+z=uE| z;0WN;z;A$T_-8cu46s{EYXCE$=Yu{PSOho-$f+9{F+4hEKty2oAo!nint>6pp}wuG z0w>jod|O+FT|kcHA@XVP4v?NXgmRXLqWV?t`>HWGx^MW12*cP5o*mu{r2P>ihYyK~ zGK>{U_W&7V;UnS_hV+3e2FLV?3Q7S;>}O4dSHW{!eFjGl=?90F0MCx}8yq)+GjgJrrH6%E9WVZ>wWxlF&H-cqp9MAs zvSXEitltNICFX-(!oVUM5fK>`)o-}5zOOaH=KZXZFM`eZ5E%!gEMWM}n*G zERc(>~pdjb?rb1MR z95OQ4IF0hY;E$pK2G=SeM>rnH4t4{wBMFl%4_1fHDas3^2fiL|4e0S?YbxGJ08tSc zNkAHm0dfTGfUHnS>28JJ472k00hzxL$oeCJjET02FR#!Eq}`06)|~GEvO{x$te=oP z(;8_wh$nZ8J)Nzl|Vb@WjrsJl7e>1`dIz!2*Gny*|USY=;|$ zUFly}vzBR@`Ig;$Km>V0;!z|R-6x&BKeTLqhf;CikAjEzM=j@-4>T4vuZvFzM{&iWUDTvdxwta>pqkqj}T%ra~B{0{y(uK$B5NW;5; zT(_sISp_~^WsP_fkQdL{K;9-CT5U~5*_GBv27_luUX30-f-Y|d9rrJZRe+qbd_cyA z0c6L&K|Olr7%+hi??HmAU^S4gzK~`ad=E&My$+t9d3wDSd`o~V=iFe`>jdQ1{by4c zhWd<|IzV=$Adoxjy;Q7!_Vm+KtEYQ_++vpjInqQR8;$_7qYZ(K-sgcFfuZy(E3ESG z0vUwcw^|-dg3i?xqp%~89mv>bb*SMAtY-$5&e($tx=glP4OTz}(?e*89n&4sQ&kxG z+^Qcgw>oq?-SXHmAO|oBc4$8tcDXOaDf?Z4>_~7OMd*fg1zoTq8lVB)kuT8@J9ND| zcC>9_6$h2t)}VDMTY)MzkM#UF{N9HLR^NSeaLtfyz1v)NxdtuXwejM?ukTCgFnfb- zb2}e?;NBK!GpfRX&6C2$**pnl%DyFW1jz#j%x|WOPMa z4YJ#df@X~XbsPt&i9dVPFq>t^7-(H2Me)`MP~QGrBPkYUtLF}HWX+JvlNuW2z6Y%a zMrn9ThXuI<8)KBv@_14g1$#jW@MQE3ai<{Fz;eZkAje&3Ej?kWA@&!W$c3J^diD)X zq*yPQeh&Bc%~(!Sr`UpB(CV4BN_P)(Z-b_y2+iJs*2v21736M$?*=bsmK>j{rS=YT z?}QeNJi`;-HOT&JGbt91mTKc$f>k3G-A;nm)~uh}HOT#R3!Bl^vKAWT8VId5GzN54 z&xxPiE)eal!Vy7kXG@#W(bB?#TqB|N$Sgd!v&($~Oj9#I{AiH7$V)cE@@VPhLGB1> z$}K&D+-cC*Q7=zv4Dd2Ex+0e+by<+R9KK^%uDJ4Akb5XJ*0X!U&j-1;D9ziGIycB& z8Q)IWJHx}F#6x?DB_;f6Tafz@)Fx1|65+KxZEQvzt=XHmkz(C37n9mZH=yHPS+lWq~1pP=?OBLsCZ{EI=Z;n3(BYYynv^ zWZ%+37Dw9Zxo&o_+$6TnxvF|l%T@7ZYy6pvI~ojKiP5|o?1G{?jP5&M(X)eX%iRnb z8+4dMON2(hT66UgG=`7U@^ZP3Rx7zYr89zEP+B4HDXtdBSIm;Ir?GXF?_^DsmuWB- z8t1}oE~-zUu`w^X@;p4=*=DqZhD{J2?*y$2^E{=y1-UmuYXQyMYWg13=1?7`nO0q_ zOiTbG$^(r?t)h;jP-}R?5<={@u2L)-GvBzYbOSnSgmU``i?)S0JV=IF$va4Px00>8 zA&RZ!G9)`#$?uVDV2W?e_ft2U#X zC+y7-$3moDHdEgs)zeHh?StT83YW{!7+ZbY4HF!J_)gbZ!eS5#?;(kAH5?8i?I&n2 zL&JK;boc6)xfx*-OoyiSo-IM{0DL{<2=9BzDT>uh$S z7g7Vw#vJYl7_{0Qgd`mRr@~b|@tu$xEMjL~kb5??%+105QFhJY9Ed!R|He8lB)DL# zd6)!E?bo}5nU&>uW02a|O?NhfW;vIWG9Q|?>KM?ULbE0llj0~m82hQ!@1aOWNXATC z9WOIQ&pAd!*^K^H{&^(pdQy&uxa$nD76BpvyTR@uvUogpltTEnKxcW;t@iHGQY-;6 z|NJQF26QhPWi{*MUgf$1jh)ZhZz_(q^4;bD20>#yI6b_OZh=}9NQI_i3>Vm|(3&7GYi6E*&0^FgZV*(pmO_K|M<&-c0%n}L$; zU$+@UEhp}KT^56KmzV-KWtMb|hYFw0KucdSNBrXv%Tt*$n_q1v&9L^Gri;1^Y7J;9Rcl7!9H`wr8SjR;Zy+_;>?||v)8 zj@k_EmFHR!>Y1xHa7hisLV;#2r&R1iHhjs=+}!OU^JMXS47loii^XC>ybOfKt17hg zAjf5B%{(b{LtJlqtYFE!z`O2%;f|TbbXj0st+SXlV7TLEF~5M}tSoa6mP8^4zwfBVe2yqt`>uwRZ2H5!qL1W*bVNZA$nq`x_ z;>;w=rj>UA8pGbwf|E0?px#VqT!L25u0i9?tEo9c7xRJy&$u@rWws@$y==j@#j-dF zGt+tr)~lo>A-<`tqB#I&k0Q58@PT$%N&?% z8W@_&WZc)myh;P+7Ts#CwMARgF$G#jE3bQy<8x^3JsEvN+!fQTV6;j_L1U2Rk}J(^ z!QRmN>K0^fE1TPUoi+VdoBW;u!kSm!TGw1}tvRy;j<=z`Y&KGKgSD&Tz7*@CA2jm< zWNN9e~JaY&?LVMK{mKNgZw260bW_&E$B*j)?mL7l# zHz`NAH*sTX&XQvtlK9fR3Y(j2Gw&HWclLgp%`mg?0Io*evRfEUH0KzDWVDsMj$|)M zSq-)Yo}xsVN%tWnc_ZMEEBMyo^%gcStIUwBa0jPbF=#n?JTyAe)Eusz z{JI>r1jTwG$v`qQY`esFt*yS@*d^W8qeGFqbT8~5?UD?8YtCjXSD6pxM5WjW9d%-_Y5C$7q;-;SaIQ zk6T_kX3L#G&aOD31G=}ur-1ZXUX@Rzo=@c$Qhat~eqqHEY0nqv1eOFczm&q#ZgeS^ zWE`{cF3T{=DgJpN`&B{dF935vudMU{AU{OTZJ^Ts3TeN(D)$6TFgsR5708aPSX1#t z>a~FEU@(vatgG^$gn5wPLgf=#zopW%5Wzr$tyIR7kQH02e4;n>SCpO|X{VFo{|afZ zvntowPbYvJQFo;iUDD=+t*G=kVRQZIf9Cx4MPbg<0A*w_ki8iK*O;IaL>j6J zq@ij+_Oyn=ARs#uqV#$S8!Bv~@>>8|zop_^D{QCoUs2cvh);sS1Pymr*b7M4^aIjR ze;_*&3FL>!kquG#(Te{k$N>&RdDg9> zJwO^>r1Zr=hxq?)D_ViY(x4L8t74l}v8@WXlb5JZv8Qr)A3$XX}s zcS7kWfpptvKz@j9?mUpA%TW3yl~1Jo%Rol{HKkwAjX9yA?^VVxKpJ|W@K;svH-(RY z>>z(c&JH<%)LlR};0CgO9))>nUk?r~4ZY0VHU+Fpvg{16iRV zkOkWS*})ivDL{5?6_Bo8lRoU6t?|FNws6H0ZhzU8gLAdA zKTeLChKkqPUzV;fexLcQ^=tnKm56P7=3Cl$6>dKtv1y zkum~AX}M0qCmKYXks!)Q@<L9~CaSlaqw*Qeg_9hfE-Z z$$3IgsWuhROQr!NViFA9o(eA?pOhR1b)}Ng!rPXcCCv1t9j2m?Q3F5Z6dVC4-nJ zyGSH01mV9JghwJ5gJ`h`#8DCp#disa`y}F*fDk!CB27S4UJ4>v;+BHwngk+)#1g5H z0>YIHVpa->6gf{~CyBbtKrEMO%Rodd263B2s?=T%!e+s#3K@GrDZCJ@+lxTrGi)|4@jIN5w;S<23fZf#MEUV@~#50NkUhF2wo0i4~fm< zUJc?JiKx{ew#qINNh?73uK}@5BG-UukqY7{iS6S128jD4;@<#~E=NeDtprhdEr?wb zw-!X#RUk4*yek#bK)6p(=T0dbqe`%-&72%k4Vq^t+= zp_AL;PNPH_T(?OKq24Yh>i0krz#5odS zJ3-u(bvr>!eH%pHT_A2t=q?b!+d=Fh@x8d;0db8))H@*V$}SQ~J3#oqo2!-mM=u%p zZm!PKA|1?8GCz4qvE5+qlZoFA<`*ydh)mi}FqQX!dEg~u_JHZS3rq%?U%ljoy*j13Q6Qa5G_6cag;<6@jV3MK8g54Ad1Qn5@{cTsC*cN zuf!b&(RDwF3=+kq!VwUz10ZG{0pTy_N$ez1_ahJ`W!gs|A`XJMO`^2a{uqSMArL7a zgD4}{NgO88<`WQQCHWH&v4=rCBJsSmJPM-x5fGb>f~X)5NSq@Pb__&CS$7P?)Q>>q zJr1I>gdPVG{4t0T$f+ji-@``~n>_U~pvrxPc=ow#V-%rI*g{mB%jaZ|Cw#uT1nf!A-2Df^mvrSEIz_%&DVbM^Vu$}r}(k`Zkj_5C0J zZhgp&!n0*Qk1j?9pHXtMjiXS)XhrkU^-?}C$0t^Cd>XwST)f5QGoPLRfDC@d%dobNLUj|6$Nu0)0mdyl37^-L4L%9~L2(lm zhX>%sW5rF9_i5sFWRb}avC$SjQ^DaMe?iKyD{dwT4hg?>WjGW!PYSk!iTTK)!wNwP zs4S1-3WF=GxCP+YR1ruq#VwL>nn+T`@e4~vC6$$|I3I8Uid(EW{3@4GO>s+PD@`m_ zS;disw`R;wisJmB;T=NrvrKXR(C`|W`B^Tu_L$-oDyt;OQC5zTs<=|n`9mgtRw}ME z(nA%uN^#GETcEhriYo)I2byAs*C_5er1>*_sKy%>*OR}+Xf#kyo!6>@=1(>hm!`Pq zQSPpak9CSG5AIjRtyf$Ha5kh#Z;-nfW8Du_Rz*;ej6Hll1joKrf^<>bK~=6YxUPyj zBn>;j#9@`ipLIJ_))8=YdR2&1aUUy=uMj;2j?s5i=F!A4Wdd*a8iTMZ_#=noio=_n z#$d&rP$uxQoiUWF2cJ`Ng(l9b;z6KJTdUdlOclpVg~lbtomb^*gS!Hbfqp@%y$lmy zsw}*kYFtyruPP32!5N3ZaSeP0j@fuK**K=S>oS2RZmQz-ku^@4xTUxT;3|RRy11>l zhDiU4G(X?TNtj6Z9x7ee7?MYsxU0A(;PxQRCG(@=nj*a)X?}iETr;E@mHhkyWL!6g zaJ@VOysx+xNPoqt#^(VzwA<5Y3FWpT**8{x2@(j73+*?>wL*F}YH(wG1ddVF8qxwB zSDgc$XWcfCBTV4ql=okOo4i$4J5Xnk#RcgC$8qCTIHNwe62RQ59Nq&p(jffgk%ArJ zrl(ZaE1=k8e)1{~Z%>*%A(u~??Syn&68IEQ9A1w#mN5+Rd0N%Q@4^_V;7S1tDGo2d z8lPYTEe$MearyY0Z)QKs0E@_0^r`MMs(g1)ZLmhm0*flH2hwv8^;~E^iVH(}uHt;f z)(IwxtE^tgx`+tp0`gN_Z=}Bm$LRN0TsYD$a17@X(t##Qs;oYs@~f;;it7vR9@6~T zcxfP~xgVq>$}z;BlT?~`9$Ac&0g!sgVx-pvhiT!9w#F=^8RGR67m4&agg_HueYr~$ zomJK#P+Xf$fnC6HiU&h_fMfWDg5x$H1qlPk&roUD8777)6VafSpdJHmxH2&m=@p6_ zsmculmrDEi#K=6F7_Ewr0QDPs&j^SE2d5h&As4_g2on_-gY*Un18$03p@|e_eKe@P z5C+^bWi}RR1_uLfg(??^G-HEYs#NQOSY4^I#)6_{#^Nf)jYIlo9{lJGxLR@XNb^Mi z#^M^qjaM9-dqZ&vOe4u-*OGr5g?_ZU)kPS&E+{;5el-A&Zda=VPl}K4TV?V+>(@K9Tp)r@F_LjX9vo zDH|sgHy2zI(zJC_ar2Nq0TVQJN(zQL3bp0cgI)7L&M51jDsBNd{TkL8#VrK46lt12 ztGIowkif^UkJK9Gcvd#Hakyk@sN=G2hs1YtRCIrU+4vB$KYdp>$7i-?Yp~_;g#_MH z@E&3qWH@95WF#a8G72&p5(|lgjDd`WjDy5O#^;emJsfW&e2H=M9ir|SMJ&Q24#M~S z_%7g32;UiufKNC>13gfHFl9_0tfkC1zipCCU&eu3PFJb*le@V@0Y$Rh|}Ha?gh z+S4(^D}irraKByw8Gr#tLij#PZODs|5J(+JT}XXMLr5T`7KHD$l!26m@U;-WNRto3 z7j`~_oQ8x#c=PNJxd#U}fdly#-}mgl8^3#W7l|JrKSJ(7euDfA`2}(x@&NJ>@+;&w z$RoFO?&BC$Ara{bkk=p+A(J4JAyXmKATuB{A)};bUq_h^e5I7HpSFdxgS3Zqfbd<` zmmqutArKM(sRF4AsRpSGF(5VwUq=2N!ndz4$*#VR>JGlIeOT@ynO>=%!z))pU5t}& z%@l#~#iZ4!w+6yJB@J>4J~#t83ONkf2NB40NIWDC@+zbcq#2|Xk$d7P+$p!R+I3P|4U**0H`3~}Z`jrSr8C%^q!Ec6af$&Ac z2nctHG7!Fsc^&d0qzjDm?dI|jZ-^U`TN(~@%t_$;hyx*mAcG-M5N;BDBa?4$-h>>0 z9E2Q#9EKc$d<6Lz@(JW9eP5c(Jab9AEI>weJ^*s7g9>N`zJLW0Kr;wBAYZWOt%u(oRzL2^c*)955yWi#H zbnJe^pKaI{dN4Z%%mZ`-c^A#Q>no7Q7+(}{AS4np0MZ}Q2l6T;9FM;p&7bX!WEV(h zNGC{rNC>1hBroKWA>9@@4kiR69R#Tb*@y1cg!vjsSBC^bszNG4DnOox6oll16oBN1 z6oNbrIfA<7fMp@iK?*~jh4@2?LyAI*K%Rm4K#D>3;xCdIzKYy~vHBrhDl5}0SOR+K z92||6gs?1)={n@gK-f4NW8=i~5O#1k28Z8xF0^SG=emSG=wxzdNW{CNJ~h2NE=9NNL3#+ z&v~n*bdqQ}($GgDpkZzDrNLL8^sh+?5UR$c6O6`82`jSR> zBY+0R+X;9HNpgc!-e4ft%OYSjWQf^f(@{wF0X-Ku2a*Wkvy#ye{9?5c0~`tIjr34p zIFM#WAkBKifx{$29Mx^3q+pVxP)%AK4;c%IgM5Rb#sXQZFFG^^Y5anY`9vWe>2Z)T z__2zkWWsDDCqURR8)OyT!JM6W4ds|W9XJaz6EXub4Kfun1@by%GGr3u4KzIw$nwl% z=h+r*Fpaho{zv2URl#|{oE_77y3;hY0OdT8g%CEzPToMn^yXzq2IOX>K=wmEguD;g2YC;&7xETlD`X4gO~@w5 zM#u)pI!GF1E#wWz8pvwMDu_VnUjHdM}j}xRhmd&2#1ZCHm-mL2Dve|VVG$@x~Hmob} zL8Z4L+aRpS^bQCc-wxajc^C2yWEUhIvJ=7%=!WzX&^EL4w4Yu7fIAKeHt?iTj6{W; z1`jGD+9Rz0q`KMbWgmU^vfuDmtp14s-RtaSv!``q*^TQuT;e*dQI}81Ug5JGBh!U+ zj9kc;uj_r0%|qJwC2%S}jf<)d%QIisQ??U~FHwLyA>}dBk08H6?m_NAzJYuVd5C-p z`5z(7BmXUg{13p}in|584!H@r24OyR;thpNKjdrR%+Q7IB2B~JL3E?U?;%!&Kl0?V zmuJJ|blqQ}KY-kakoy_(6C|??+Bctb=?XdVAqwltnU%6NKyT&jEXx_VPhlQA_d7(} z<>#k(^PPLxr3 z38o=FaH9b)ATxDuHR_Jg8#y~e<24|x-x_uK0}(#m;rG~=ARJH)NOedcq$;EeBmh#` z0sr&KCf!vL@&cp+LNGpZhl%9qEj zP-#XhJHUs83{a+trJys-hl0ds6*8@DWVfw3)_uVJUlY7IlBBLjt#wX?ZtzJSV>!l3 zcJJuAy51A>xc>jDAV*&f!ZO*{u6BD)Z{%!*%a|S3Jg1o*Y6ffyNoa}x8bg{xYC_l$ z11RUlL!O-WRxOr+AudfmU?tBoTm|eL1B`*oz~*vf2N;a>WC(=czYdls2g)DgM7verbZ}+p2&YH&O^I$ud$|R?^oRK3{Oe5ZE?%*+yGvh` zXe|2$DKm(`|8KpO@K+Zd9YonZ^LP6MFS&Xkt&rwmc=`R40VVujAJIPcE3bCgYwNOL@UNlIimipkz7&KiFD zkJN5)#maH-8aZs2m ztAsw)ATFcMcf&?btdf<}7VqVv6Z#m0u0M{u_r^yn)?^i!B6rz|Hzdz&l+(v8{M;bl zhR$KbD`%CfCG}Cj)<`zbb^2D;$1gN45LM^$wTUI|ww_f3f&<`NeNe-ce0wJS`rg8e zcD#GMe7191O?`er{D?!rk0T!6q3IygQTl{~>+csH6#B}K?`Gw^Ct-6i$JUt$Mq<;d zUypvVdFtt`0{Ya1O&MR@+53E*5m`A!Wdo`f*T*bO?^5W!6E_de$|}%VF449=mmy%l zwX3U3ecmvufIhjQ#pS7IUW)nkm8_g}sSGF7)JHuG%^3Ootc;huvI^+KAcozpvUJSP zFKo@qDJWx6)%FK(w*Qa3S=0La>NuppJfq;5oiA^CcEkB{n1Sj6fdMt}gsG7%n~w-x z(MWdAceeJ^#~t)rJ+X7UVP#$WWB1rBA_F zRygnQd{bWE!Cs?b6bZ#2m@R}b$UAIy<6>85-bYR?WT4lBJIG$v)kki$u2gQ@s&b_R z&2gDirVr;hP;BUDKh^VXf}HAB-J}lk)Dq0Y>JHL#snbX5EpZmB_2F9(i}X(jux-Me{OZ)jiNvwxC2U{K0DTuh>7{@%fgsZ-2Kd%Z5HFWbNZ}UwQkU zX`YqyOsG6garU%#>>)juIam7WGe5?iy!yiKQxD2utk~@XYT?;N5Aj=$vE=V5?Uy?f z?N@usspZc8e)?z%W5k-5zp1#ZI%;4C3C1j*=p`LjIN!GS=`D5EqUM<1QZE(#)Q4cy zS~j++CvDo7c3V}3B0R3o<>>Qyy*7ROUAdQ)bEmh=L|uEnaCsvY`-46j>Hr%x9-JubM(jd|6E!vow!vAh@c zl}}cq*X#SrH>=^Z=Kb)y3s_eAT#~aP5jDJr{oKy1QJYJ>M1MK41~pLf#v11_`;h^1 zc^&i{17yp3XMg3(*8gDq;Sq9ft@DMf?&Pa`wWq#5`gUwqPVPvVjk@;YkH3D!s#xsa$Ifka~aJPLU5CJ;$Z4B>Fw6xy{XX?W@X4WZstlo@Y z`6pF&!VR{yMJ1Gu`%O<JvsQb=vn|Zp*4~5=3>GRYN*j(5%-rDPfT)sSe?9;*xZoZmTH}43U ziMoFJ=$8uKZEtKSGmO_Vw9B4#8zK8>T^|}#`KgqHNuHKnvr6b=WeUtK^|jxM<-D;| z?H(N=`8K1jKH;WnhxXl5uLR7s>M|1a88|(@`!O~!{_|ujhci)qr1U^tKYe;mi5GUB z_Rl@fn(rDc5kFGq(z-rxXZh2C4`;q!%j%gqZha!p$4^x`QaY;Gs4VMuM#@Fj)o1w( z*s^!e*q}EnStVfHz;Qq3=^WSMChSa)m^t0dF|CHjNTn_4nLZ$B#lu61o$8P1j}o}C z;L6w*BfVKdA1U;8|4RqzuBpJg7I-G0S~VlrC|R%tYX%pJ!&|UDP9G&NZN-+L4>f8u z=bM|*t6s9w(*#F&W`s4>-3qg+kUt1)Uqpv%E9eK;R)im3;waX z9=+t&y?x!XX|b6 z{m$aW|0ZI5?C;N#ZXa0AG5rxeTfWGycb+3XKZMoTIkNG?Y$Jp92tR%F(14Fq_B$`W z^_|^@XDWf*mv+vRQr{tV56+Xv`+*ndNr4l<2lJ%C7r=b;rNMDvnfX%c3I@O85F$_) z+CE>79mrM~h2|cCessS09mK?z^GN%H&>MIp@quN;%n$V}`Vs12kCZwDoaB+#mw+iA zIq@T^S$v?q!2K+vy(LpX@jq%F?uH3roYZpqr!&a;8 zI)`Ak?z2eh9D~`thcPK?T$%WU%GtUs7mj22x=z6)srmyNsE{O=>9eLuGK9X=4fRQq zV@_`$drXq#yJ~g7>_~}Z`R$`Wc1(BB#0HBc@zfvf{UKksujlRw12xNkw?s-Dg&kc^ zkIl7I29wuzl%F%_T=!qk3;I8sF`yimIZwNmN+}n{r|lnHDtqBr`^BX)`#MnjC1<ar)hne3O4|3Vlr8MV zv6V8H`Zv(o8+~|M*;not7`E>Bm~3&jO7^+Yf4z(5jA*^9>d4i*r;eGNv7)ybwX0TH zC4LXlk#?)3>N()xRrpO!;A|km*uH6%^v(m!5#DOkHdkGN8z}$bszvAVt>(}7SsmlL zpIX=6KD1hfUV|Z>uVX)3|IKYGXFlwh>rahKZe75hs|)GOYih+7c1K^W^aV&CcK2|0*&F>LeYdI!#u~hkCYLiXaBb0=7+yPS*q>f6 z<1S|9`RSwaYVFu|c=(k09Zf6d7h+x8xk1L`Dwugyv3BJ^d#4SO$g3uH->OexdrJHU zZc+-j=xdj(OR3*wAh!7SmvMKXjppb^Ca<^hZ0_b9$vamp&bVDdKE{VVn{eN14v;%gEE`n2j})-bOE8QbIzN@Px=Uafi|WxJU%S81jf)XjJm!*4K|U)*$L{K=C3`|U?xU;ek7%>Vdy@;{?iFGsya>%Qtp)RzDq-TIkB z&atV8_R|OD-rAA-X{VFUpx$_kX9=d`$QEj{MhwPyD9+*OzX_=>Pr-x#%hH8q#35 zvsj+sM@~Er!Y|4h-qPxntC*C@>s=PVRg>N#ulEVNJs9W47Vs`Xe6fIc+oEaaUunRv zSna`Y#^RH^PE2sUQq`n=n!{&GdI9hB^a8Fk)ns!c*Ci?Ql6P@w*4I@a{Y+!mp!{;? zq^p4R>EasVHed7@88@_F`iU;C`MITOC)Y?RaNFCN9`UNn8O@UAb6-|X+}|VKr(C7W zqP2FL4!0zI`R@wd!T72rW diff --git a/packages/authz/src/space-member/space-member.service.ts b/packages/authz/src/space-member/space-member.service.ts index 5fbde171b..050cac7b6 100644 --- a/packages/authz/src/space-member/space-member.service.ts +++ b/packages/authz/src/space-member/space-member.service.ts @@ -12,7 +12,7 @@ import { type IInvitationRepository, } from "./invitation.repository" import { InvitationMailService, type IInvitationMailService } from "./invitation.service" -import { WithEmail, WithInvitedAt, WithRole, WithStatus } from "./invitation.specification" +import { WithEmail, WithInvitedAt, WithRole, WithSpaceId, WithStatus } from "./invitation.specification" import { SpaceMember, type ISpaceMemberRole } from "./space-member" import type { SpaceMemberComositeSpecification } from "./space-member.composite-specification" import { injectSpaceMemberRepository, type ISpaceMemberRepository } from "./space-member.repository" @@ -75,7 +75,7 @@ export class SpaceMemberService implements ISpaceMemberService { throw new Error("Cannot invite to personal space") } - const spec = new WithEmail(dto.email) + const spec = new WithEmail(dto.email).and(new WithSpaceId(space.unwrap().id.value)) const existInvitation = await this.invitationQueryRepository.findOne(spec) if (existInvitation.isSome()) { const invitation = existInvitation.unwrap() diff --git a/packages/env/src/index.ts b/packages/env/src/index.ts index a88fcc01b..d2bca181b 100644 --- a/packages/env/src/index.ts +++ b/packages/env/src/index.ts @@ -68,6 +68,7 @@ const storageEnv = createEnv({ const emailEnv = createEnv({ server: { + UNDB_MAIL_PROVIDER: z.enum(["nodemailer", "mailgun"]).default("nodemailer").optional(), UNDB_MAIL_HOST: z.string().optional(), UNDB_MAIL_PORT: z.string().optional(), UNDB_MAIL_DEFAULT_FROM: z.string().optional(), @@ -88,6 +89,8 @@ const emailEnv = createEnv({ message: "UNDB_VERIFY_EMAIL must be a boolean", }) .transform((v) => v === "true"), + UNDB_MAILGUN_API_KEY: z.string().optional(), + UNDB_MAILGUN_DOMAIN: z.string().optional(), }, runtimeEnv: import.meta.env, emptyStringAsUndefined: true, diff --git a/packages/persistence/src/tables.ts b/packages/persistence/src/tables.ts index 9c742fa12..5e83cd87e 100644 --- a/packages/persistence/src/tables.ts +++ b/packages/persistence/src/tables.ts @@ -390,7 +390,7 @@ export const invitations = sqliteTable( "invitation", { id: text("id").notNull().primaryKey(), - email: text("email").notNull().unique(), + email: text("email").notNull(), role: text("role").notNull().$type(), status: text("status").notNull().$type(), spaceId: text("space_id") @@ -404,6 +404,7 @@ export const invitations = sqliteTable( (table) => { return { spaceIdIdx: index("invitation_space_id_idx").on(table.spaceId), + uniqueIdx: unique("invitation_unique_idx").on(table.email, table.spaceId), } }, ) From 8567d9313e808f041121dff80011d06dad7541d2 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Thu, 15 Aug 2024 22:56:00 +0800 Subject: [PATCH 2/3] fix: fix mailgun --- apps/backend/package.json | 3 +-- apps/backend/src/modules/mail/mail.ts | 9 ++++----- bun.lockb | Bin 579072 -> 575800 bytes 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 2e85f4ced..c3f7da3d4 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -45,10 +45,10 @@ "got": "^14.4.2", "handlebars": "^4.7.8", "lucia": "^3.2.0", + "mailgun-nodemailer-transport": "^3.0.2", "minio": "^8.0.1", "nanoid": "^5.0.7", "nodemailer": "^6.9.14", - "nodemailer-mailgun-transport": "^2.1.5", "oslo": "^1.2.1", "radash": "^12.1.0", "reflect-metadata": "^0.2.2", @@ -57,7 +57,6 @@ }, "devDependencies": { "@types/nodemailer": "^6.4.15", - "@types/nodemailer-mailgun-transport": "^1.4.6", "@types/uuid": "^10.0.0", "bun-types": "latest", "kysely": "^0.27.4" diff --git a/apps/backend/src/modules/mail/mail.ts b/apps/backend/src/modules/mail/mail.ts index 5dc63956a..7677a2ee0 100644 --- a/apps/backend/src/modules/mail/mail.ts +++ b/apps/backend/src/modules/mail/mail.ts @@ -2,14 +2,13 @@ import { singleton } from "@undb/di" import { env } from "@undb/env" import { createLogger } from "@undb/logger" import { IMailService, ISendInput } from "@undb/mail" +import MailgunTransport from "mailgun-nodemailer-transport" import { createTransport } from "nodemailer" -import mg from "nodemailer-mailgun-transport" -import SMTPConnection from "nodemailer/lib/smtp-connection" import { compile } from "./templates/compile" function createMailerTransport() { if (env.UNDB_MAIL_PROVIDER === "nodemailer" || !env.UNDB_MAIL_PROVIDER) { - const options: SMTPConnection.Options = { + const options = { host: env.UNDB_MAIL_HOST, port: 465, // port: env.UNDB_MAIL_PORT ? parseInt(env.UNDB_MAIL_PORT, 10) : undefined, @@ -25,9 +24,9 @@ function createMailerTransport() { } return createTransport( - mg({ + new MailgunTransport({ auth: { - api_key: env.UNDB_MAILGUN_API_KEY!, + apiKey: env.UNDB_MAILGUN_API_KEY!, domain: env.UNDB_MAILGUN_DOMAIN!, }, }), diff --git a/bun.lockb b/bun.lockb index 2dcc5e87568e4660ae40b30f2de93b7b2e98db8c..151e6cd0d57fb0cdc53f76f3a6adab74645e8249 100755 GIT binary patch delta 35463 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 delta 37252 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 Date: Thu, 15 Aug 2024 15:00:26 +0000 Subject: [PATCH 3/3] Prepare release v1.0.0-12 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73f4c71b8..03f292d53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ # Changelog +## v1.0.0-12 + + +### 🩹 Fixes + +- Fix mailgun ([8567d93](https://github.com/undb-io/undb/commit/8567d93)) + +### ❤️ Contributors + +- Nichenqin ([@nichenqin](http://github.com/nichenqin)) + ## v1.0.0-11 diff --git a/package.json b/package.json index 80017cd2d..c77affd81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "undb", - "version": "1.0.0-11", + "version": "1.0.0-12", "private": true, "scripts": { "build": "NODE_ENV=production bun --bun turbo build",