backend gitignore
This commit is contained in:
9
backend-api/.env.sample.dev
Normal file
9
backend-api/.env.sample.dev
Normal 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='*'
|
||||
|
||||
5
backend-api/.gitignore
vendored
5
backend-api/.gitignore
vendored
@@ -1,7 +1,4 @@
|
||||
#db정보
|
||||
config.serverless.yml
|
||||
.env.dev
|
||||
.env.prod
|
||||
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
|
||||
17
backend-api/config.serverless.sample.yml
Normal file
17
backend-api/config.serverless.sample.yml
Normal 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
|
||||
111
backend-api/package-lock.json
generated
111
backend-api/package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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
102
backend-api/serverless.yml
Normal 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
|
||||
@@ -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],
|
||||
|
||||
21
backend-api/src/sample/entity/sample.entity.ts
Normal file
21
backend-api/src/sample/entity/sample.entity.ts
Normal 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;
|
||||
|
||||
|
||||
}
|
||||
12
backend-api/src/sample/sample.controller.ts
Normal file
12
backend-api/src/sample/sample.controller.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
13
backend-api/src/sample/sample.module.ts
Normal file
13
backend-api/src/sample/sample.module.ts
Normal 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 {
|
||||
}
|
||||
17
backend-api/src/sample/sample.service.ts
Normal file
17
backend-api/src/sample/sample.service.ts
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
63
backend-api/src/serverless.ts
Normal file
63
backend-api/src/serverless.ts
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user