Skip to content

Commit

Permalink
feat: authjs integration (#17)
Browse files Browse the repository at this point in the history
* feat: authjs

Signed-off-by: Innei <[email protected]>

* feat: db integration

Signed-off-by: Innei <[email protected]>

* fix: cache

Signed-off-by: Innei <[email protected]>

* fix: ci

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

* update

Signed-off-by: Innei <[email protected]>

---------

Signed-off-by: Innei <[email protected]>
  • Loading branch information
Innei committed Jul 12, 2024
1 parent 20d475a commit ed5995b
Show file tree
Hide file tree
Showing 66 changed files with 1,167 additions and 1,744 deletions.
4 changes: 4 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@ POSTGRES_PASSWORD=password
POSTGRES_USER=postgres

DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@127.0.0.1:5432/nest-drizzle

GITHUB_CLIENT_ID=
AUTH_SECRET=
GITHUB_CLIENT_SECRET=
9 changes: 4 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,12 @@ jobs:

strategy:
matrix:
node-version: [16.x]
node-version: [20.x]

steps:
- uses: actions/checkout@v4
- uses: pnpm/[email protected]
with:
version: 8.x.x
- uses: pnpm/[email protected]

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
Expand All @@ -47,7 +46,7 @@ jobs:

- name: Install Dependencies
run: |
pnpm i --no-optional
pnpm i
- name: Build project
run: |
npm run build
8 changes: 3 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:

- uses: actions/setup-node@v3
with:
node-version: 16.x
node-version: 20.x
- name: Start MongoDB
uses: supercharge/[email protected]
with:
Expand All @@ -29,9 +29,8 @@ jobs:
uses: supercharge/[email protected]
with:
redis-version: 6
- uses: pnpm/action-setup@v2.4.0
- uses: pnpm/action-setup@v4.0.0
with:
version: 8.x.x
run_install: true
- name: Test
run: |
Expand Down Expand Up @@ -111,9 +110,8 @@ jobs:
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-
- uses: pnpm/action-setup@v2.4.0
- uses: pnpm/action-setup@v4.0.0
with:
version: 8.x.x
run_install: true
- name: Build project
run: |
Expand Down
8 changes: 3 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:

strategy:
matrix:
node-version: [16.x]
node-version: [20.x]

steps:
- uses: actions/checkout@v4
Expand All @@ -41,9 +41,8 @@ jobs:
with:
redis-version: 6

- uses: pnpm/[email protected]
with:
version: 8.x.x
- uses: pnpm/[email protected]

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
Expand All @@ -55,7 +54,6 @@ jobs:
- name: Run Test
run: |
pnpm run lint
pnpm run pretest
pnpm run test
env:
CI: true
Expand Down
6 changes: 4 additions & 2 deletions apps/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"prod:debug": "cross-env NODE_ENV=production nest start --debug --watch"
},
"dependencies": {
"@auth/core": "0.34.1",
"@auth/drizzle-adapter": "1.4.1",
"@meta-muse/complied": "workspace:*",
"@meta-muse/drizzle": "workspace:*",
"@meta-muse/utils": "workspace:*",
"@nestjs/cache-manager": "2.2.2",
Expand All @@ -40,6 +41,7 @@
"cache-manager": "5.7.2",
"cache-manager-ioredis": "2.1.0",
"chalk": "^4",
"cls-hooked": "4.2.2",
"consola": "^3.2.3",
"cron": "^3.1.7",
"cross-env": "7.0.3",
Expand Down Expand Up @@ -97,4 +99,4 @@
"disablePostinstall": "1",
"systemBinary": "/opt/homebrew/bin/redis-server"
}
}
}
22 changes: 18 additions & 4 deletions apps/core/src/app.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { argv } from 'zx-cjs'

import { parseBooleanishValue } from './constants/parser.utilt'
import { isDev } from './shared/utils/environment.util'
import { machineIdSync } from './shared/utils/machine.util'
import { mergeArgv } from './utils/env.util'
import type { AxiosRequestConfig } from 'axios'
Expand All @@ -18,6 +17,8 @@ export const CROSS_DOMAIN = {
'shizuri.net',
'localhost:9528',
'localhost:2323',
'localhost:3000',
'localhost:3333',
'127.0.0.1',
'mbp.cc',
'local.innei.test',
Expand All @@ -31,10 +32,15 @@ export const REDIS = {
port: mergeArgv('redis_port') || 6379,
password: mergeArgv('redis_password') || null,
ttl: null,
httpCacheTTL: 5,
max: 5,
disableApiCache:
(isDev || mergeArgv('disable_cache')) && mergeArgv('enable_cache_debug'),
}

export const HTTP_CACHE = {
ttl: 15, // s
enableCDNHeader:
parseBooleanishValue(argv.http_cache_enable_cdn_header) ?? true, // s-maxage
enableForceCacheHeader:
parseBooleanishValue(argv.http_cache_enable_force_cache_header) ?? false, // cache-control: max-age
}

export const DATABASE = {
Expand Down Expand Up @@ -64,3 +70,11 @@ export const ENCRYPT = {
: false,
algorithm: mergeArgv('encrypt_algorithm') || 'aes-256-ecb',
}

export const AUTH = {
github: {
clientId: mergeArgv('github_client_id'),
clientSecret: mergeArgv('github_client_secret'),
},
secret: mergeArgv('auth_secret'),
}
25 changes: 14 additions & 11 deletions apps/core/src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
import { LoggerModule } from 'nestjs-pretty-logger'

import { Module, Type } from '@nestjs/common'
import {
type MiddlewareConsumer,
Module,
type NestModule,
Type,
} from '@nestjs/common'
import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core'
import { ThrottlerGuard } from '@nestjs/throttler'

import { AppController } from './app.controller'
import { AllExceptionsFilter } from './common/filters/all-exception.filter'
import { RolesGuard } from './common/guards/role.guard'

import { HttpCacheInterceptor } from './common/interceptors/cache.interceptor'
import { IdempotenceInterceptor } from './common/interceptors/idempotence.interceptor'
import { JSONTransformerInterceptor } from './common/interceptors/json-transformer.interceptor'
import { ResponseInterceptor } from './common/interceptors/response.interceptor'
import { ZodValidationPipe } from './common/pipes/zod-validation.pipe'
import { AuthModule } from './modules/auth/auth.module'
import { PostModule } from './modules/post/post.module'
import { UserModule } from './modules/user/user.module'
import { CacheModule } from './processors/cache/cache.module'
import { DatabaseModule } from './processors/database/database.module'
import { GatewayModule } from './processors/gateway/gateway.module'
import { HelperModule } from './processors/helper/helper.module'
import { RequestContextMiddleware } from './common/middlewares/request-context.middleware'
import { UserModule } from './modules/user/user.module'

// Request ----->
// Response <-----
Expand All @@ -40,7 +45,6 @@ const appInterceptors: Type<any>[] = [

// BIZ
AuthModule,
PostModule,
UserModule,
],
controllers: [AppController],
Expand All @@ -60,15 +64,14 @@ const appInterceptors: Type<any>[] = [
useClass: ThrottlerGuard,
},

{
provide: APP_GUARD,
useClass: RolesGuard,
},

{
provide: APP_FILTER,
useClass: AllExceptionsFilter,
},
],
})
export class AppModule {}
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(RequestContextMiddleware).forRoutes('(.*)')
}
}
87 changes: 87 additions & 0 deletions apps/core/src/common/contexts/request.context.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/* eslint-disable dot-notation */
// @reference https://github.com/ever-co/ever-gauzy/blob/d36b4f40b1446f3c33d02e0ba00b53a83109d950/packages/core/src/core/context/request-context.ts
import * as cls from 'cls-hooked'
import { UnauthorizedException } from '@nestjs/common'
import type { IncomingMessage, ServerResponse } from 'node:http'

type UserDocument = {}

type Nullable<T> = T | null
export class RequestContext {
readonly id: number
request: IncomingMessage
response: ServerResponse

constructor(request: IncomingMessage, response: ServerResponse) {
this.id = Math.random()
this.request = request
this.response = response
}

static currentRequestContext(): Nullable<RequestContext> {
const session = cls.getNamespace(RequestContext.name)
if (session && session.active) {
return session.get(RequestContext.name)
}

return null
}

static currentRequest(): Nullable<IncomingMessage> {
const requestContext = RequestContext.currentRequestContext()

if (requestContext) {
return requestContext.request
}

return null
}

static currentUser(throwError?: boolean): Nullable<UserDocument> {
const requestContext = RequestContext.currentRequestContext()

if (requestContext) {
const user: UserDocument = requestContext.request['user']

if (user) {
return user
}
}

if (throwError) {
throw new UnauthorizedException()
}

return null
}

static currentSession() {
const requestContext = RequestContext.currentRequestContext()
const session = requestContext?.request['session']
if (!session) {
throw new UnauthorizedException()
}
return session as {
expires: string
user: {
name: string
email: string
image: string
}
}
}

static currentIsAuthenticated() {
const requestContext = RequestContext.currentRequestContext()

if (requestContext) {
const isAuthenticated =
requestContext.request['isAuthenticated'] ||
requestContext.request['isAuthenticated']

return !!isAuthenticated
}

return false
}
}
Loading

0 comments on commit ed5995b

Please sign in to comment.