Merge branch 'development' into 'devops-staging'

Development

See merge request empatnusabangsa/ppob/ppob-backend!40
This commit is contained in:
ilham dwi pratama 2021-12-20 07:07:42 +00:00
commit efe43c811f
8 changed files with 78 additions and 50 deletions

View File

@ -36,6 +36,7 @@
"class-validator": "^0.13.1", "class-validator": "^0.13.1",
"crypto": "^1.0.1", "crypto": "^1.0.1",
"decimal.js": "^10.3.1", "decimal.js": "^10.3.1",
"fs-extra": "^10.0.0",
"joi": "^17.4.2", "joi": "^17.4.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"nestjs-pino": "^2.3.1", "nestjs-pino": "^2.3.1",
@ -57,6 +58,7 @@
"@nestjs/testing": "^8.0.0", "@nestjs/testing": "^8.0.0",
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
"@types/jest": "^27.0.1", "@types/jest": "^27.0.1",
"@types/multer": "^1.4.7",
"@types/node": "^16.0.0", "@types/node": "^16.0.0",
"@types/passport-jwt": "^3.0.6", "@types/passport-jwt": "^3.0.6",
"@types/passport-local": "^1.0.34", "@types/passport-local": "^1.0.34",

View File

@ -10,6 +10,7 @@ import { ProductModule } from './product/product.module';
import { ConfigurableModule } from './configurable/configurable.module'; import { ConfigurableModule } from './configurable/configurable.module';
import { AuthModule } from './auth/auth.module'; import { AuthModule } from './auth/auth.module';
import configuration from './config/configuration'; import configuration from './config/configuration';
import { MulterModule } from '@nestjs/platform-express';
@Module({ @Module({
imports: [ imports: [
@ -30,6 +31,9 @@ import configuration from './config/configuration';
DATABASE_PORT: Joi.number().default(5432), DATABASE_PORT: Joi.number().default(5432),
}), }),
}), }),
MulterModule.register({
dest: './files',
}),
TypeOrmModule.forRootAsync({ TypeOrmModule.forRootAsync({
imports: [ConfigModule], imports: [ConfigModule],
useFactory: (configService: ConfigService) => { useFactory: (configService: ConfigService) => {

View File

@ -10,5 +10,7 @@ export default () => {
password: process.env.DATABASE_PASSWORD || '', password: process.env.DATABASE_PASSWORD || '',
name: process.env.DATABASE_NAME, name: process.env.DATABASE_NAME,
}, },
upload_dir: __dirname + '/../uploads',
upload_url_path: '/files/',
}; };
}; };

View File

@ -9,9 +9,15 @@ import {
ParseUUIDPipe, ParseUUIDPipe,
HttpStatus, HttpStatus,
Query, Query,
UseInterceptors,
UploadedFile,
Res,
} from '@nestjs/common'; } from '@nestjs/common';
import { RoleService } from './roles.service'; import { RoleService } from './roles.service';
import { CommissionService } from './commission.service'; import { CommissionService } from './commission.service';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { editFileName } from '../helper/file-handler';
@Controller({ @Controller({
path: 'config', path: 'config',
@ -61,6 +67,11 @@ export class ConfigurableController {
}; };
} }
@Get('/image/:imgpath')
seeUploadedFile(@Param('imgpath') image, @Res() res) {
return res.sendFile(image, { root: './files' });
}
@Get(':id') @Get(':id')
async findOne(@Param('id', ParseUUIDPipe) id: string) { async findOne(@Param('id', ParseUUIDPipe) id: string) {
return { return {
@ -70,6 +81,23 @@ export class ConfigurableController {
}; };
} }
@Post('/upload-files')
@UseInterceptors(
FileInterceptor('file', {
storage: diskStorage({
destination: './files',
filename: editFileName,
}),
}),
)
async uploadedFile(@UploadedFile() file: Express.Multer.File) {
const response = {
originalname: file,
filename: file.filename,
};
return response;
}
@Put('/commission/:id') @Put('/commission/:id')
async updateCommission( async updateCommission(
@Param('id', ParseUUIDPipe) id: string, @Param('id', ParseUUIDPipe) id: string,

View File

@ -0,0 +1,12 @@
import * as path from 'path';
export const editFileName = (req, file, callback) => {
const name = file.originalname.split('.')[0];
const fileExtName = path.extname(file.originalname);
// const fileExtName = 'asdasd';
const randomName = Array(4)
.fill(null)
.map(() => Math.round(Math.random() * 16).toString(16))
.join('');
callback(null, `${name}-${randomName}${fileExtName}`);
};

View File

@ -1,17 +1,14 @@
import { NestFactory } from '@nestjs/core'; import { NestFactory } from '@nestjs/core';
import {
FastifyAdapter,
NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { ValidationPipe, VersioningType} from '@nestjs/common'; import { ValidationPipe, VersioningType } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { Logger } from 'nestjs-pino'; import { Logger } from 'nestjs-pino';
import { NestExpressApplication } from '@nestjs/platform-express';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>( const app = await NestFactory.create<NestExpressApplication>(
AppModule, AppModule,
new FastifyAdapter(), // new FastifyAdapter(),
{ bufferLogs: true }, { bufferLogs: true },
); );
@ -31,13 +28,14 @@ async function bootstrap() {
const configService = app.get<ConfigService>(ConfigService); const configService = app.get<ConfigService>(ConfigService);
const port = configService.get<number>('port'); const port = configService.get<number>('port');
await app.listen(port, '0.0.0.0', (error, address) => { await app.listen(port, '0.0.0.0', () => {
if (error) { logger.log('Service Started');
logger.error(error); // if (error) {
process.exit(1); // logger.error(error);
} else { // process.exit(1);
logger.log(`Server listening on ${address}`); // } else {
} // logger.log(`Server listening on ${address}`);
// }
}); });
} }

View File

@ -57,11 +57,12 @@ export class ProductService {
if (supplier == 'null' || !supplier) { if (supplier == 'null' || !supplier) {
supplier = (await this.supplierService.findByActive()).id; supplier = (await this.supplierService.findByActive()).id;
} }
const baseQuery = this.productRepository const baseQuery = this.productRepository
.createQueryBuilder('product') .createQueryBuilder('product')
.leftJoin('product.sub_categories', 'sub_categories') .leftJoin('product.sub_categories', 'sub_categories')
.leftJoin('sub_categories.category', 'category') .leftJoin('sub_categories.category', 'category')
.where('product.supplier_id = :supplier_id', { .where(`product.supplier_id = :supplier_id`, {
supplier_id: supplier, supplier_id: supplier,
}) })
.leftJoinAndMapOne( .leftJoinAndMapOne(
@ -131,12 +132,16 @@ export class ProductService {
if (supplier != 'null' && !supplier) { if (supplier != 'null' && !supplier) {
supplier = (await this.supplierService.findByActive()).id; supplier = (await this.supplierService.findByActive()).id;
} }
const baseQuery = this.productRepository const baseQuery = this.productRepository
.createQueryBuilder('product') .createQueryBuilder('product')
.leftJoin('product.sub_categories', 'sub_categories') .leftJoin('product.sub_categories', 'sub_categories')
.where('product.supplier_id = :supplier_id', { .where(
supplier_id: supplier, `product.supplier_id = :supplier_id and product.status = 'ACTIVE'`,
}) {
supplier_id: supplier,
},
)
.leftJoinAndMapOne( .leftJoinAndMapOne(
'product.currentPrice', 'product.currentPrice',
'product.priceHistory', 'product.priceHistory',
@ -176,7 +181,7 @@ export class ProductService {
.createQueryBuilder('product') .createQueryBuilder('product')
.leftJoin('product.sub_categories', 'sub_categories') .leftJoin('product.sub_categories', 'sub_categories')
.where( .where(
'sub_categories.category_id = :id and product.supplier_id = :supplier_id', `sub_categories.category_id = :id and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`,
{ {
id: categories, id: categories,
supplier_id: supplier.id, supplier_id: supplier.id,

View File

@ -990,6 +990,13 @@
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
"@types/multer@^1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e"
integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==
dependencies:
"@types/express" "*"
"@types/node@*", "@types/node@^16.0.0": "@types/node@*", "@types/node@^16.0.0":
version "16.11.10" version "16.11.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae"
@ -1803,15 +1810,6 @@ chalk@^1.1.1:
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
supports-color "^2.0.0" supports-color "^2.0.0"
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
version "4.1.2" version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
@ -2840,7 +2838,7 @@ fresh@0.5.2:
resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
fs-extra@10.0.0: fs-extra@10.0.0, fs-extra@^10.0.0:
version "10.0.0" version "10.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
@ -4599,7 +4597,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
pino-abstract-transport@v0.5.0:
pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0:
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0"
@ -4681,23 +4678,6 @@ pino@^7.0.5:
sonic-boom "^2.2.1" sonic-boom "^2.2.1"
thread-stream "^0.13.0" thread-stream "^0.13.0"
pino@^7.5.1:
version "7.5.1"
resolved "https://registry.yarnpkg.com/pino/-/pino-7.5.1.tgz#6e4cd3389e9365caf64039d4b83dcfa84ed43fee"
integrity sha512-Wzo2G7CLaRHKOz3+Ex006LC5Xi0xEUm+mwm/h0NKzuKZONdekcbmjXg7vWDoO8hVTGX+1RuUy2fwlzvZ24EI5A==
dependencies:
fast-redact "^3.0.0"
fastify-warning "^0.2.0"
get-caller-file "^2.0.5"
on-exit-leak-free "^0.2.0"
pino-abstract-transport v0.5.0
pino-std-serializers "^4.0.0"
quick-format-unescaped "^4.0.3"
real-require "^0.1.0"
safe-stable-stringify "^2.1.0"
sonic-boom "^2.2.1"
thread-stream "^0.13.0"
pirates@^4.0.1: pirates@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
@ -4988,7 +4968,6 @@ reusify@^1.0.4:
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rfdc@^1.1.4, rfdc@^1.2.0:
rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0: rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz"
@ -5084,7 +5063,6 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
ajv "^6.12.5" ajv "^6.12.5"
ajv-keywords "^3.5.2" ajv-keywords "^3.5.2"
secure-json-parse@^2.0.0:
secure-json-parse@^2.0.0, secure-json-parse@^2.4.0: secure-json-parse@^2.0.0, secure-json-parse@^2.4.0:
version "2.4.0" version "2.4.0"
resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz"
@ -6124,4 +6102,3 @@ zen-observable@0.8.15:
version "0.8.15" version "0.8.15"
resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==