Skip to content

Commit

Permalink
feat: Create and connect to frontend show email error logs API
Browse files Browse the repository at this point in the history
  • Loading branch information
aXenDeveloper committed Sep 24, 2024
1 parent 1bfbbb2 commit 8ec764e
Show file tree
Hide file tree
Showing 19 changed files with 390 additions and 33 deletions.
16 changes: 16 additions & 0 deletions apps/backend/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,21 @@ input LogosEditAdminThemeEditor {
width: Float!
}

type LogsAdminEmail {
created: DateTime!
error: String!
html: String!
id: Float!
provider: String!
subject: String!
to: String!
}

type LogsAdminEmailObj {
edges: [LogsAdminEmail!]!
pageInfo: PageInfo!
}

type Mutation {
admin__core_authorization_settings__edit(force_login: Boolean!, lock_register: Boolean!): ShowAdminAuthorizationSettingsObj!
admin__core_email_settings__edit(color_primary: String!, color_primary_foreground: String!, logo: UploadWithKeepCoreFilesArgs, provider: EmailProvider!, resend_key: String, smtp: SMTPEditAdminEmailSettingsService): ShowAdminEmailSettingsServiceObj!
Expand Down Expand Up @@ -280,6 +295,7 @@ type PageInfo {

type Query {
admin__core_authorization_settings__show: ShowAdminAuthorizationSettingsObj!
admin__core_email__logs(cursor: Int, first: Int, last: Int): LogsAdminEmailObj!
admin__core_email_settings__show: ShowAdminEmailSettingsServiceObj!
admin__core_files__show(cursor: Int, first: Int, last: Int, search: String, sortBy: ShowCoreFilesSortByArgs): ShowAdminFilesObj!
admin__core_groups__show(cursor: Int, first: Int, last: Int, search: String, sortBy: ShowAdminGroupsSortByArgs): ShowAdminGroupsObj!
Expand Down
25 changes: 25 additions & 0 deletions apps/frontend/src/graphql/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,23 @@ export type LogosEditAdminThemeEditor = {
width: Scalars['Float']['input'];
};

export type LogsAdminEmail = {
__typename?: 'LogsAdminEmail';
created: Scalars['DateTime']['output'];
error: Scalars['String']['output'];
html: Scalars['String']['output'];
id: Scalars['Float']['output'];
provider: Scalars['String']['output'];
subject: Scalars['String']['output'];
to: Scalars['String']['output'];
};

export type LogsAdminEmailObj = {
__typename?: 'LogsAdminEmailObj';
edges: Array<LogsAdminEmail>;
pageInfo: PageInfo;
};

export type Mutation = {
__typename?: 'Mutation';
admin__core_authorization_settings__edit: ShowAdminAuthorizationSettingsObj;
Expand Down Expand Up @@ -641,6 +658,7 @@ export type PageInfo = {
export type Query = {
__typename?: 'Query';
admin__core_authorization_settings__show: ShowAdminAuthorizationSettingsObj;
admin__core_email__logs: LogsAdminEmailObj;
admin__core_email_settings__show: ShowAdminEmailSettingsServiceObj;
admin__core_files__show: ShowAdminFilesObj;
admin__core_groups__show: ShowAdminGroupsObj;
Expand Down Expand Up @@ -670,6 +688,13 @@ export type Query = {
};


export type QueryAdmin__Core_Email__LogsArgs = {
cursor?: InputMaybe<Scalars['Int']['input']>;
first?: InputMaybe<Scalars['Int']['input']>;
last?: InputMaybe<Scalars['Int']['input']>;
};


export type QueryAdmin__Core_Files__ShowArgs = {
cursor?: InputMaybe<Scalars['Int']['input']>;
first?: InputMaybe<Scalars['Int']['input']>;
Expand Down
4 changes: 3 additions & 1 deletion apps/frontend/src/plugins/admin/langs/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@
"desc": "Send emails from your website. Unlock more features like password reset, email verification, and more.",
"logs": {
"title": "Email Error Logs",
"from": "From",
"id": "ID",
"to": "To",
"provider": "Provider",
"subject": "Subject",
"created": "Created",
"error": "Error"
Expand Down
4 changes: 4 additions & 0 deletions packages/backend/src/core/admin/email/email.module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Global, Module } from '@nestjs/common';

import { LogsAdminEmailResolver } from './logs/logs.resolver';
import { LogsAdminEmailService } from './logs/logs.service';
import { MailService } from './mail.service';
import { SendAdminEmailService } from './send/send.service';
import { EditAdminEmailSettingsResolver } from './settings/edit/edit.resolver';
Expand All @@ -17,6 +19,8 @@ import { TestAdminEmailSettingsService } from './settings/test/test.service';
EditAdminEmailSettingsService,
TestAdminEmailSettingsService,
TestAdminEmailSettingsResolver,
LogsAdminEmailService,
LogsAdminEmailResolver,
],
})
export class AdminEmailModule {}
Expand Down
38 changes: 38 additions & 0 deletions packages/backend/src/core/admin/email/logs/logs.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { PageInfo, PaginationArgs } from '@/utils';
import { ArgsType, Field, ObjectType } from '@nestjs/graphql';

@ArgsType()
export class LogsAdminEmailArgs extends PaginationArgs {}

@ObjectType()
export class LogsAdminEmail {
@Field(() => Date)
created: Date;

@Field(() => String)
error: string;

@Field(() => String)
html: string;

@Field(() => Number)
id: number;

@Field(() => String)
provider: string;

@Field(() => String)
subject: string;

@Field(() => String)
to: string;
}

@ObjectType()
export class LogsAdminEmailObj {
@Field(() => [LogsAdminEmail])
edges: LogsAdminEmail[];

@Field(() => PageInfo)
pageInfo: PageInfo;
}
19 changes: 19 additions & 0 deletions packages/backend/src/core/admin/email/logs/logs.resolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { AdminAuthGuards } from '@/utils';
import { UseGuards } from '@nestjs/common';
import { Args, Query, Resolver } from '@nestjs/graphql';

import { LogsAdminEmailArgs, LogsAdminEmailObj } from './logs.dto';
import { LogsAdminEmailService } from './logs.service';

@Resolver()
export class LogsAdminEmailResolver {
constructor(private readonly service: LogsAdminEmailService) {}

@Query(() => LogsAdminEmailObj)
@UseGuards(AdminAuthGuards)
async admin__core_email__logs(
@Args() args: LogsAdminEmailArgs,
): Promise<LogsAdminEmailObj> {
return await this.service.logs(args);
}
}
44 changes: 44 additions & 0 deletions packages/backend/src/core/admin/email/logs/logs.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { core_logs_email } from '@/database/schema/logs';
import { inputPaginationCursor, outputPagination } from '@/functions';
import { InternalDatabaseService, SortDirectionEnum } from '@/utils';
import { Injectable } from '@nestjs/common';
import { count } from 'drizzle-orm';

import { LogsAdminEmailArgs, LogsAdminEmailObj } from './logs.dto';

@Injectable()
export class LogsAdminEmailService {
constructor(private readonly databaseService: InternalDatabaseService) {}

async logs({
cursor,
first,
last,
}: LogsAdminEmailArgs): Promise<LogsAdminEmailObj> {
const pagination = await inputPaginationCursor({
cursor,
database: core_logs_email,
databaseService: this.databaseService,
first,
last,
primaryCursor: {
column: 'id',
schema: core_logs_email.id,
},
defaultSortBy: {
column: 'created',
direction: SortDirectionEnum.desc,
},
});

const edges = await this.databaseService.db.query.core_logs_email.findMany({
...pagination,
});

const totalCount = await this.databaseService.db
.select({ count: count() })
.from(core_logs_email);

return outputPagination({ edges, totalCount, first, cursor, last });
}
}
83 changes: 70 additions & 13 deletions packages/backend/src/core/admin/email/mail.service.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { core_logs_email } from '@/database/schema/logs';
import { InternalDatabaseService } from '@/utils';
import { Injectable } from '@nestjs/common';
import { render } from '@react-email/render';
import * as fs from 'fs';
Expand All @@ -21,6 +23,32 @@ export interface SendMailServiceArgs {

@Injectable()
export class MailService extends HelpersAdminEmailSettingsService {
constructor(private readonly databaseService: InternalDatabaseService) {
super();
}

private async handleErrors({
to,
html,
error,
subject,
provider,
}: {
error: string;
html: string;
provider?: string;
subject: string;
to: string;
}) {
await this.databaseService.db.insert(core_logs_email).values({
to,
subject,
error,
html,
provider,
});
}

async sendMail({
to,
subject,
Expand Down Expand Up @@ -63,12 +91,21 @@ export class MailService extends HelpersAdminEmailSettingsService {
},
);

// TODO: Handle errors
void transporter.sendMail({
to,
subject,
html,
});
try {
await transporter.sendMail({
to,
subject,
html,
});
} catch (e) {
const error = e as Error;
await this.handleErrors({
error: error.message,
html,
subject,
to,
});
}
}

if (
Expand All @@ -77,13 +114,33 @@ export class MailService extends HelpersAdminEmailSettingsService {
) {
const resend = new Resend(config.resend_key);

// TODO: Handle errors
await resend.emails.send({
from: `${configSettings.settings.general.site_name} <[email protected]>`,
to,
subject,
html,
});
try {
const provider = await resend.emails.send({
from: `${configSettings.settings.general.site_name} <[email protected]>`,
to,
subject,
html,
});

if (provider.error) {
await this.handleErrors({
error: `[${provider.error.name}]: ${provider.error.message}`,
html,
subject,
to,
provider: 'Resend',
});
}
} catch (e) {
const error = e as Error;
await this.handleErrors({
error: error.message,
html,
subject,
to,
provider: 'Resend',
});
}
}
}
}
2 changes: 1 addition & 1 deletion packages/backend/src/database/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import * as admins from './schema/admins';
import * as files from './schema/files';
import * as groups from './schema/groups';
import * as languages from './schema/languages';
import * as logs from './schema/logs';
import * as moderators from './schema/moderators';
import * as nav from './schema/nav';
import * as plugins from './schema/plugins';
import * as sessions from './schema/sessions';
import * as terms from './schema/terms';
import * as users from './schema/users';
import * as logs from './schema/logs';

export default {
...groups,
Expand Down
4 changes: 3 additions & 1 deletion packages/backend/src/database/schema/logs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ export const core_logs_email = pgTable('core_logs_email', {
to: varchar('to', { length: 255 }).notNull(),
subject: varchar('subject', { length: 255 }).notNull(),
created: timestamp('created').notNull().defaultNow(),
error: text('error'),
error: text('error').notNull(),
html: text('html').notNull(),
provider: varchar('provider', { length: 20 }).notNull().default('SMTP'),
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import * as Types from '../../../../types';

import gql from 'graphql-tag';
export type Admin__Core_Email__LogsQueryVariables = Types.Exact<{
cursor?: Types.InputMaybe<Types.Scalars['Int']['input']>;
first?: Types.InputMaybe<Types.Scalars['Int']['input']>;
last?: Types.InputMaybe<Types.Scalars['Int']['input']>;
}>;


export type Admin__Core_Email__LogsQuery = { __typename?: 'Query', admin__core_email__logs: { __typename?: 'LogsAdminEmailObj', edges: Array<{ __typename?: 'LogsAdminEmail', created: Date, error: string, html: string, id: number, subject: string, to: string, provider: string }>, pageInfo: { __typename?: 'PageInfo', count: number, endCursor?: number, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: number, totalCount: number } } };


export const Admin__Core_Email__Logs = gql`
query Admin__core_email__logs($cursor: Int, $first: Int, $last: Int) {
admin__core_email__logs(cursor: $cursor, first: $first, last: $last) {
edges {
created
error
html
id
subject
to
provider
}
pageInfo {
count
endCursor
hasNextPage
hasPreviousPage
startCursor
totalCount
}
}
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
query Admin__core_email__logs($cursor: Int, $first: Int, $last: Int) {
admin__core_email__logs(cursor: $cursor, first: $first, last: $last) {
edges {
created
error
html
id
subject
to
provider
}
pageInfo {
count
endCursor
hasNextPage
hasPreviousPage
startCursor
totalCount
}
}
}
Loading

0 comments on commit 8ec764e

Please sign in to comment.