Skip to content

Commit b93342a

Browse files
authored
Merge pull request #1 from masb0ymas/master
merge from fork
2 parents 9f1e27a + 0e5492f commit b93342a

File tree

14 files changed

+578
-658
lines changed

14 files changed

+578
-658
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">Welcome to boilerplate-express-typescript-sequelize 👋</h1>
22
<p>
3-
<img alt="Version" src="https://img.shields.io/badge/version-1.2.2-blue.svg?cacheSeconds=2592000" />
3+
<img alt="Version" src="https://img.shields.io/badge/version-2.0.0-blue.svg?cacheSeconds=2592000" />
44
<img src="https://img.shields.io/badge/npm-%3E%3D6.10.0-blue.svg" />
55
<img src="https://img.shields.io/badge/node-%3E%3D10.x-blue.svg" />
66
<a href="https://github.com/masb0ymas/boilerplate-express-typescript-sequelize#readme" target="_blank">

package.json

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "boilerplate-express-typescript",
3-
"version": "1.2.2",
3+
"version": "2.0.0",
44
"description": "Just Boilerplate Express with TypeScript ( 🦊 )",
55
"private": true,
66
"scripts": {
@@ -69,16 +69,16 @@
6969
"yup": "^0.29.3"
7070
},
7171
"devDependencies": {
72-
"@babel/cli": "^7.11.6",
73-
"@babel/core": "^7.11.6",
74-
"@babel/node": "^7.10.4",
75-
"@babel/plugin-proposal-class-properties": "^7.8.3",
76-
"@babel/plugin-proposal-object-rest-spread": "^7.11.0",
72+
"@babel/cli": "^7.12.1",
73+
"@babel/core": "^7.12.3",
74+
"@babel/node": "^7.12.1",
75+
"@babel/plugin-proposal-class-properties": "^7.12.1",
76+
"@babel/plugin-proposal-object-rest-spread": "^7.12.1",
7777
"@babel/plugin-transform-runtime": "^7.11.5",
78-
"@babel/preset-env": "^7.11.5",
79-
"@babel/preset-typescript": "^7.8.3",
80-
"@babel/register": "^7.11.5",
81-
"@babel/runtime": "^7.11.2",
78+
"@babel/preset-env": "^7.12.1",
79+
"@babel/preset-typescript": "^7.12.1",
80+
"@babel/register": "^7.12.1",
81+
"@babel/runtime": "^7.12.1",
8282
"@types/bcrypt": "^3.0.0",
8383
"@types/body-parser": "^1.19.0",
8484
"@types/cors": "^2.8.8",
@@ -89,7 +89,7 @@
8989
"@types/jsonwebtoken": "^8.3.7",
9090
"@types/lodash": "^4.14.162",
9191
"@types/multer": "^1.4.4",
92-
"@types/node": "^14.11.8",
92+
"@types/node": "^14.11.10",
9393
"@types/nodemailer": "^6.4.0",
9494
"@types/nodemailer-mailgun-transport": "^1.4.1",
9595
"@types/passport": "^1.0.2",
@@ -105,7 +105,7 @@
105105
"babel-plugin-module-resolver": "^4.0.0",
106106
"eslint": "^7.11.0",
107107
"eslint-config-airbnb-base": "^14.0.0",
108-
"eslint-config-prettier": "^6.12.0",
108+
"eslint-config-prettier": "^6.13.0",
109109
"eslint-import-resolver-babel-module": "^5.1.2",
110110
"eslint-plugin-import": "^2.22.1",
111111
"eslint-plugin-prettier": "^3.1.4",

src/controllers/Auth/controller.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ routes.post(
2020
'/auth/sign-in',
2121
asyncHandler(async function signIn(req: Request, res: Response) {
2222
const formData = req.getBody()
23-
const { token, expiresIn, tokenType, uid } = await AuthService.signIn(
24-
formData
25-
)
23+
const { token, expiresIn, tokenType } = await AuthService.signIn(formData)
2624

27-
return res.status(200).json({ token, expiresIn, tokenType, uid })
25+
return res.status(200).json({ token, expiresIn, tokenType })
2826
})
2927
)
3028

src/controllers/Auth/service.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import path from 'path'
33
import models from 'models'
44
import jwt from 'jsonwebtoken'
5-
import { Request } from 'express'
65
import { isObject } from 'lodash'
76
import handlebars from 'handlebars'
87
import EmailProvider from 'config/email'

src/controllers/Role/controller.ts

+1-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
/* eslint-disable no-unused-vars */
2-
import { FilterQueryAttributes } from 'models'
32
import { Request, Response } from 'express'
43
import routes from 'routes/public'
54
import asyncHandler from 'helpers/asyncHandler'
@@ -13,20 +12,7 @@ const keyGetAll = `${APP_KEY_REDIS}_role:getAll`
1312
routes.get(
1413
'/role',
1514
asyncHandler(async function getAll(req: Request, res: Response) {
16-
const {
17-
page,
18-
pageSize,
19-
filtered,
20-
sorted,
21-
}: FilterQueryAttributes = req.getQuery()
22-
23-
const { data, total } = await RoleService.getAll(
24-
page,
25-
pageSize,
26-
filtered,
27-
sorted
28-
)
29-
15+
const { data, total } = await RoleService.getAll(req)
3016
return res.status(200).json({ data, total })
3117
})
3218
)

src/controllers/Role/service.ts

+11-17
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/* eslint-disable no-unused-vars */
2-
/* eslint-disable no-param-reassign */
32
import models from 'models'
4-
import { filterQueryObject } from 'helpers/Common'
53
import ResponseError from 'modules/ResponseError'
64
import useValidation from 'helpers/useValidation'
75
import { RoleAttributes } from 'models/role'
6+
import PluginSqlizeQuery from 'modules/SqlizeQuery/PluginSqlizeQuery'
87
import schema from './schema'
98

109
const { Role } = models
@@ -13,25 +12,20 @@ class RoleService {
1312
/**
1413
* Get All Role
1514
*/
16-
public static async getAll(
17-
page: string | number,
18-
pageSize: string | number,
19-
filtered: string,
20-
sorted: string
21-
) {
22-
if (!page) page = 0
23-
if (!pageSize) pageSize = 10
24-
25-
const filterObject = filtered ? filterQueryObject(JSON.parse(filtered)) : []
15+
public static async getAll(req: any) {
16+
const { includeCount, order, ...queryFind } = PluginSqlizeQuery.generate(
17+
req,
18+
Role,
19+
[]
20+
)
2621

2722
const data = await Role.findAll({
28-
where: filterObject,
29-
offset: Number(pageSize) * Number(page),
30-
limit: Number(pageSize),
31-
order: [['createdAt', 'desc']],
23+
...queryFind,
24+
order: order.length ? order : [['createdAt', 'desc']],
3225
})
3326
const total = await Role.count({
34-
where: filterObject,
27+
include: includeCount,
28+
where: queryFind.where,
3529
})
3630

3731
return { data, total }

src/controllers/User/service.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import db from 'models/_instance'
55
import ResponseError from 'modules/ResponseError'
66
import useValidation from 'helpers/useValidation'
77
import { UserAttributes } from 'models/user'
8-
import UserRole from 'models/userrole'
98
import { Transaction } from 'sequelize/types'
109
import UserRoleService from 'controllers/UserRole/service'
1110
import PluginSqlizeQuery from 'modules/SqlizeQuery/PluginSqlizeQuery'
@@ -14,7 +13,7 @@ import schema from './schema'
1413
const { Sequelize } = db
1514
const { Op } = Sequelize
1615

17-
const { User, Role } = models
16+
const { User, Role, UserRole } = models
1817
const including = [{ model: Role }]
1918

2019
class UserService {

src/helpers/Common.ts

+1-22
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* eslint-disable no-unused-vars */
22
import fs from 'fs'
33
import db from 'models/_instance'
4-
import { FilterAttributes } from 'models'
54

65
const { Sequelize } = db
76
const { Op } = Sequelize
@@ -19,26 +18,6 @@ function getUniqueCodev2(length = 32) {
1918
return result
2019
}
2120

22-
// Filter Query Object
23-
function filterQueryObject(filtered: FilterAttributes[]) {
24-
const resultObject = {}
25-
if (typeof filtered !== 'object') {
26-
throw new Error(`Filtered must be an object, expected ${typeof filtered}`)
27-
}
28-
29-
for (let i = 0; i < filtered.length; i += 1) {
30-
// eslint-disable-next-line prefer-const
31-
let { id, value } = filtered[i]
32-
if (id.split('.').length > 1) {
33-
id = `$${id}$`
34-
}
35-
// @ts-ignore
36-
resultObject[id] = { [Op.like]: `%${value}%` }
37-
}
38-
39-
return resultObject
40-
}
41-
4221
// Read HTML File
4322
function readHTMLFile(path: any, callback: any) {
4423
fs.readFile(path, { encoding: 'utf-8' }, function (err, html) {
@@ -50,4 +29,4 @@ function readHTMLFile(path: any, callback: any) {
5029
})
5130
}
5231

53-
export { getUniqueCodev2, readHTMLFile, filterQueryObject, invalidValues }
32+
export { getUniqueCodev2, readHTMLFile, invalidValues }

src/models/index.ts

-17
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,6 @@ import Role from './role'
22
import User from './user'
33
import UserRole from './userrole'
44

5-
export interface FilterAttributes {
6-
id: string
7-
value: string
8-
}
9-
10-
export interface SortAttributes {
11-
id: string
12-
desc: string
13-
}
14-
15-
export interface FilterQueryAttributes {
16-
page: string | number
17-
pageSize: string | number
18-
filtered: string
19-
sorted: string
20-
}
21-
225
const models = {
236
Role,
247
User,

src/modules/SqlizeQuery/PluginSqlizeQuery.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable no-unused-vars */
12
import SqlizeQuery from 'modules/SqlizeQuery/index'
23
import {
34
getPrimitiveDataType,
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class QueryHelper {
2+
private valueQuery: any = {}
3+
4+
private data: any[]
5+
6+
constructor(data: any[]) {
7+
this.data = data
8+
}
9+
10+
getDataValueById(id: any) {
11+
return this.data.find((x) => x.id === id)?.value
12+
}
13+
14+
setQuery(id: any, value: any) {
15+
// set(this.valueQuery, id, value)
16+
this.valueQuery[id] = value
17+
}
18+
19+
getQuery() {
20+
return this.valueQuery
21+
}
22+
23+
getQueryById(id: any) {
24+
return this.valueQuery[id]
25+
}
26+
27+
deleteQuery(id: any) {
28+
return delete this.valueQuery[id]
29+
}
30+
}
31+
32+
export default QueryHelper

src/modules/SqlizeQuery/SqlizeQuery.ts

+12-51
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
/* eslint-disable no-unused-vars */
12
import { DataTypes, Includeable, IncludeOptions, Model } from 'sequelize'
3+
import QueryHelper from 'modules/SqlizeQuery/QueryHelper'
4+
import TransformHelper from 'modules/SqlizeQuery/TransformHelper'
25

36
type ValueParsers = (value: any) => any
47
type TransformBuild = (value: any, transformHelper: TransformHelper) => any
@@ -80,54 +83,11 @@ export function getPrimitiveDataType<T>(dataType: T) {
8083
return 'string'
8184
}
8285

83-
class TransformHelper<T = any> {
84-
private value: T | undefined
85-
86-
constructor(initialValue: any) {
87-
this.setValue(initialValue)
88-
}
89-
90-
setValue(value: any) {
91-
this.value = value
92-
}
93-
94-
getValue() {
95-
return this.value
96-
}
97-
}
98-
99-
class QueryHelper {
100-
private valueQuery: any = {}
101-
private data: any[]
102-
constructor(data: any[]) {
103-
this.data = data
104-
}
105-
106-
getDataValueById(id: any) {
107-
return this.data.find((x) => x.id === id)?.value
108-
}
109-
110-
setQuery(id: any, value: any) {
111-
// set(this.valueQuery, id, value)
112-
this.valueQuery[id] = value
113-
}
114-
115-
getQuery() {
116-
return this.valueQuery
117-
}
118-
119-
getQueryById(id: any) {
120-
return this.valueQuery[id]
121-
}
122-
123-
deleteQuery(id: any) {
124-
return delete this.valueQuery[id]
125-
}
126-
}
127-
12886
class SqlizeQuery {
12987
private valueParsers: ValueParsers[] = []
88+
13089
private transformBuilds: TransformBuild[] = []
90+
13191
private queryBuilders: QueryBuilders[] = []
13292

13393
addValueParser(fn: ValueParsers) {
@@ -144,24 +104,24 @@ class SqlizeQuery {
144104

145105
build(value: any) {
146106
let parserValue = value as any[]
147-
for (let i = 0; i < this.valueParsers.length; i++) {
107+
for (let i = 0; i < this.valueParsers.length; i += 1) {
148108
const getterValue = this.valueParsers[i]
149109
parserValue = getterValue(value)
150110
}
151111

152112
const queryHelper = new QueryHelper(parserValue)
153113
// executed queryBuilder min 1, when parserValue no data
154-
for (let i = 0; i < (parserValue.length || 1); i++) {
114+
for (let i = 0; i < (parserValue.length || 1); i += 1) {
155115
const valueP = parserValue[i]
156-
for (let k = 0; k < this.queryBuilders.length; k++) {
116+
for (let k = 0; k < this.queryBuilders.length; k += 1) {
157117
const queryBuilder = this.queryBuilders[k]
158118
queryBuilder(valueP, queryHelper)
159119
}
160120
}
161121

162-
let result = queryHelper.getQuery()
122+
const result = queryHelper.getQuery()
163123
const transformHelper = new TransformHelper(result)
164-
for (let i = 0; i < this.transformBuilds.length; i++) {
124+
for (let i = 0; i < this.transformBuilds.length; i += 1) {
165125
const transformBuild = this.transformBuilds[i]
166126
transformBuild(result, transformHelper)
167127
}
@@ -184,7 +144,7 @@ export function transfromIncludeToQueryable(
184144
return value
185145
}
186146
function wrapFiltered(includes: Includeable[], parent?: IncludeOptions) {
187-
for (let i = 0; i < includes.length; i++) {
147+
for (let i = 0; i < includes.length; i += 1) {
188148
const include = includes[i] as CustomIncludeOptions
189149

190150
const { model, key, include: oriInclude, ...restInclude } = include
@@ -200,6 +160,7 @@ export function transfromIncludeToQueryable(
200160
} as IncludeOptions)
201161

202162
if (parent) {
163+
// eslint-disable-next-line no-param-reassign
203164
parent.include = parent.include || []
204165
parent.include.push(data)
205166
} else {

0 commit comments

Comments
 (0)