backend gitignore

This commit is contained in:
HeeseonYoon
2022-09-22 17:26:03 +09:00
parent 96c48cc9c2
commit 1507a324f6
12 changed files with 359 additions and 19 deletions

View File

@@ -0,0 +1,9 @@
DB_TYPE='mysql'
DB_HOST='localhost'
DB_PORT=3306
DB_USERNAME='vanillameta'
DB_PASSWORD='pw'
DB_NAME='vanillameta'
CORS_ORIGIN='*'

View File

@@ -1,7 +1,4 @@
#db정보
config.serverless.yml
.env.dev
.env.prod
# compiled output
/dist

View File

@@ -0,0 +1,17 @@
AWS_REGION: ap-northeast-2
STAGE: dev
DB_CONFIG:
dev:
DB_TYPE: mysql
DB_HOST: localhost
DB_PORT: 3306
DB_USER: vanillameta
DB_PASSWORD: pw
DB_NAME: vanillameta
prod:
DB_TYPE: mysql
DB_HOST: localhost
DB_PORT: 3306
DB_USER: vanillameta
DB_PASSWORD: pw
DB_NAME: vanillameta

View File

@@ -3831,11 +3831,18 @@
}
}
},
"cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
"integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
"requires": {
"cross-spawn": "^7.0.1"
}
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -4098,6 +4105,11 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -5075,6 +5087,14 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
"generate-function": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
"requires": {
"is-property": "^1.0.2"
}
},
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -5578,6 +5598,11 @@
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
"dev": true
},
"is-property": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
},
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -5660,8 +5685,7 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"istanbul-lib-coverage": {
"version": "3.2.0",
@@ -6654,6 +6678,11 @@
"is-unicode-supported": "^0.1.0"
}
},
"long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"long-timeout": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz",
@@ -6670,7 +6699,6 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
@@ -6875,6 +6903,31 @@
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
"dev": true
},
"mysql2": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz",
"integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==",
"requires": {
"denque": "^2.0.1",
"generate-function": "^2.3.1",
"iconv-lite": "^0.6.3",
"long": "^4.0.0",
"lru-cache": "^6.0.0",
"named-placeholders": "^1.1.2",
"seq-queue": "^0.0.5",
"sqlstring": "^2.3.2"
},
"dependencies": {
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
}
}
},
"mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -6885,6 +6938,30 @@
"thenify-all": "^1.0.0"
}
},
"named-placeholders": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
"requires": {
"lru-cache": "^4.1.3"
},
"dependencies": {
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
}
}
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -7267,8 +7344,7 @@
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
},
"path-parse": {
"version": "1.0.7",
@@ -7469,6 +7545,11 @@
"ipaddr.js": "1.9.1"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -7841,6 +7922,11 @@
}
}
},
"seq-queue": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
},
"serialize-javascript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
@@ -8076,7 +8162,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
@@ -8084,8 +8169,7 @@
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
},
"shelljs": {
"version": "0.8.5",
@@ -8194,6 +8278,11 @@
"es5-ext": "^0.10.53"
}
},
"sqlstring": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
},
"stack-utils": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
@@ -9089,7 +9178,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
@@ -9235,8 +9323,7 @@
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"yaml": {
"version": "1.10.2",

View File

@@ -10,7 +10,7 @@
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:dev": "cross-env NODE_ENV=dev nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
@@ -33,6 +33,8 @@
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
"cookie-parser": "^1.4.5",
"cross-env": "^7.0.3",
"mysql2": "^2.3.3",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.2.0",

102
backend-api/serverless.yml Normal file
View File

@@ -0,0 +1,102 @@
service: vanillameta-backend-api
#frameworkVersion: '2'
plugins:
- serverless-plugin-typescript
- serverless-offline
- serverless-latest-layer-version
- serverless-plugin-warmup
provider:
name: aws
runtime: nodejs14.x
lambdaHashingVersion: 20201221
## memorySize: 512 - 기본은 512
timeout: 10
# layers:
# - arn:aws:lambda:${opt:region, self:provider.region}:${AWS::AccountId}:layer:AWSNodeLibs:latest
stage: ${opt:stage, file(./config.serverless.yml):STAGE}
region: ${opt:region, file(./config.serverless.yml):AWS_REGION}
# deploymentBucket: ${file(./config.serverless.yml):DEPLOYMENT_BUCKET}
environment:
STAGE: ${self:provider.stage}
NODE_ENV: ${self:provider.stage}
NODE_PATH: "./:/opt/node_modules"
# # DB_HOST: ${self:custom.DB_CONFIG.${self:custom.STAGE}.DB_HOST}
# # DB_USER: ${self:custom.DB_CONFIG.${self:custom.STAGE}.DB_USER}
# # DB_PASSWORD: ${self:custom.DB_CONFIG.${self:custom.STAGE}.DB_PASSWORD}
#
## iamRoleStatements:
## - Effect: Allow
## Action:
## - dynamodb:DescribeTable
## - dynamodb:Query
## - dynamodb:Scan
## - dynamodb:GetItem
## - dynamodb:PutItem
## - dynamodb:UpdateItem
## - dynamodb:DeleteItem
## Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:*"
apiGateway:
binaryMediaTypes:
- '*/*'
custom:
# Enable warmup on all functions (only for production)
warmup:
- prod
STAGE: ${self:provider.stage}
DB_CONFIG: ${file(./config.serverless.yml):DB_CONFIG}
DOMAINS:
prod: vanillameta-api.vanillabrain.com
dev: dev.vanillameta-api.vanillabrain.com
customDomain:
domainName: ${self:custom.DOMAINS.${self:custom.STAGE}}
basePath: 'v1'
stage: ${self:custom.STAGE}
createRoute53Record: true
serverless-offline:
httpPort: 4000
host: '0.0.0.0'
serverlessPluginTypescript:
tsConfigFileLocation: './tsconfig.build.json'
webpack:
includeModules: true
package:
include:
- .env.dev
- .env.prod
- src/templates/**
exclude:
- node_modules/**
- .git/**
- test/**
- e2e/**
- nodemon.json
- README.md
# - src/**
functions:
app: # 람다함수 이름
# 'handler' 모듈은 'src/serverless' 파일에서 export 되어있음
handler: src/serverless.handler
events:
- http:
method: ANY
path: /
cors:
origin: '*'
headers: '*'
allowCredentials: true
maxAge: 86400
- http:
method: ANY
path: '{proxy+}'
cors:
origin: '*'
headers: '*'
allowCredentials: true
maxAge: 86400

View File

@@ -1,7 +1,7 @@
import {Module} from '@nestjs/common';
import {AppController} from './app.controller';
import {AppService} from './app.service';
import {TestModule} from './test/test.module';
import {SampleModule} from './sample/sample.module';
import {ConfigModule} from '@nestjs/config';
import {TypeOrmModule} from '@nestjs/typeorm';
@@ -24,7 +24,7 @@ import {TypeOrmModule} from '@nestjs/typeorm';
logging: process.env.NODE_ENV == 'dev',
retryAttempts: 1,
})
, TestModule
, SampleModule
],
controllers: [AppController],
providers: [AppService],

View File

@@ -0,0 +1,21 @@
import { Entity, Column, PrimaryColumn } from 'typeorm';
@Entity('Sample')
export class Sample {
@PrimaryColumn()
id: number;
@Column({ length: 300 })
title: string;
@Column({ length: 20 })
description: string;
@Column('timestamp')
createdAt: Date;
@Column('timestamp')
updatedAt: Date;
}

View File

@@ -0,0 +1,12 @@
import {Controller, Get} from '@nestjs/common';
import {SampleService} from "./sample.service";
@Controller('test')
export class SampleController {
constructor(private readonly sampleService: SampleService) {}
@Get()
getHello() {
return this.sampleService.getSampleList();
}
}

View File

@@ -0,0 +1,13 @@
import {Module} from '@nestjs/common';
import {SampleController} from './sample.controller';
import {SampleService} from './sample.service';
import {TypeOrmModule} from "@nestjs/typeorm";
import {Sample} from "./entity/sample.entity";
@Module({
imports: [TypeOrmModule.forFeature([Sample])],
controllers: [SampleController],
providers: [SampleService]
})
export class SampleModule {
}

View File

@@ -0,0 +1,17 @@
import {Injectable} from '@nestjs/common';
import {Sample} from "./entity/sample.entity";
import {Repository} from "typeorm";
import {InjectRepository} from "@nestjs/typeorm";
@Injectable()
export class SampleService {
constructor(
@InjectRepository(Sample)
private readonly sampleRepository: Repository<Sample>,
) {}
getSampleList() {
return this.sampleRepository.find();
}
}

View File

@@ -0,0 +1,63 @@
// lambda.ts
import { Handler, Context } from 'aws-lambda';
import { Server } from 'http';
import { createServer, proxy } from 'aws-serverless-express';
import { eventContext } from 'aws-serverless-express/middleware';
import { NestFactory } from '@nestjs/core';
import { ExpressAdapter } from '@nestjs/platform-express';
import { AppModule } from './app.module';
import express from 'express';
// import { logger } from './core/middleware/logger.middleware';
import cookieParser from 'cookie-parser';
// NOTE: If you get ERR_CONTENT_DECODING_FAILED in your browser, this is likely
// due to a compressed response (e.g. gzip) which has not been handled correctly
// by aws-serverless-express and/or API Gateway. Add the necessary MIME types to
// binaryMimeTypes below
const binaryMimeTypes: string[] = [
'application/octet-stream',
'image/png',
'image/jpeg',
];
let cachedServer: Server;
async function bootstrapServer(): Promise<Server> {
// some legacy browsers (IE11, various SmartTVs) choke on 204
if (!cachedServer) {
const expressApp = express();
const nestApp = await NestFactory.create(
AppModule,
new ExpressAdapter(expressApp),
{
logger: console,
},
);
nestApp.setGlobalPrefix('v1');
nestApp.use(cookieParser());
nestApp.use(eventContext());
await nestApp.init();
cachedServer = createServer(expressApp, undefined, binaryMimeTypes);
}
return cachedServer;
}
export const handler: Handler = async (event: any, context: Context) => {
// 아래 파일 업로드 시 안되는 문제 때문에 추가.
// if (
// event.body &&
// event.headers['Content-Type'] &&
// event.headers['Content-Type'].includes('multipart/form-data')
// ) {
// // before => typeof event.body === string
// console.log('file Upoad 해야 한다.~~~~~~~~~~~~~~~~~~~~ : ', event.body);
// event.body = Buffer.from(event.body, 'binary') as unknown as string;
// // after => typeof event.body === <Buffer ...>
// }
cachedServer = await bootstrapServer();
return proxy(cachedServer, event, context, 'PROMISE').promise;
};