@vasrefil/api-toolkit 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/api-response/user.response.d.ts +48 -0
  2. package/dist/api-response/user.response.js +33 -0
  3. package/dist/app-middlewares/airbrake.d.ts +10 -0
  4. package/{src/app-middlewares/airbrake.ts → dist/app-middlewares/airbrake.js} +17 -43
  5. package/dist/controllers/_root.control.d.ts +53 -0
  6. package/dist/controllers/_root.control.js +127 -0
  7. package/dist/controllers/index.d.ts +1 -0
  8. package/dist/controllers/index.js +17 -0
  9. package/dist/controllers/sample.control.d.ts +6 -0
  10. package/dist/controllers/sample.control.js +13 -0
  11. package/dist/env.d.ts +12 -0
  12. package/{src/env.ts → dist/env.js} +7 -6
  13. package/dist/helpers/currency-formatter.helper.d.ts +1 -0
  14. package/dist/helpers/currency-formatter.helper.js +11 -0
  15. package/dist/helpers/query.helper.d.ts +22 -0
  16. package/dist/helpers/query.helper.js +133 -0
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.js +43 -0
  19. package/{src/interfaces/interface.ts → dist/interfaces/interface.d.ts} +3 -4
  20. package/dist/interfaces/interface.js +2 -0
  21. package/{src/interfaces/root-controller.interface.ts → dist/interfaces/root-controller.interface.d.ts} +8 -8
  22. package/dist/interfaces/root-controller.interface.js +2 -0
  23. package/dist/interfaces/status.interface.d.ts +13 -0
  24. package/dist/interfaces/status.interface.js +17 -0
  25. package/dist/middlewares/auth.midware.d.ts +8 -0
  26. package/dist/middlewares/auth.midware.js +52 -0
  27. package/dist/middlewares/validator.midware.d.ts +12 -0
  28. package/dist/middlewares/validator.midware.js +32 -0
  29. package/dist/models/_config.d.ts +1 -0
  30. package/dist/models/_config.js +27 -0
  31. package/dist/models/sample.model.d.ts +33 -0
  32. package/dist/models/sample.model.js +14 -0
  33. package/dist/public-api.d.ts +1 -0
  34. package/dist/public-api.js +17 -0
  35. package/dist/routes/index.route.d.ts +9 -0
  36. package/dist/routes/index.route.js +54 -0
  37. package/dist/routes/sample.route.d.ts +16 -0
  38. package/dist/routes/sample.route.js +53 -0
  39. package/dist/services/_root.service.d.ts +12 -0
  40. package/dist/services/_root.service.js +75 -0
  41. package/dist/services/sample.service.d.ts +16 -0
  42. package/dist/services/sample.service.js +127 -0
  43. package/dist/utilities/date.util.d.ts +42 -0
  44. package/dist/utilities/date.util.js +93 -0
  45. package/dist/utilities/logger.util.d.ts +4 -0
  46. package/dist/utilities/logger.util.js +48 -0
  47. package/dist/utilities/token.util.d.ts +6 -0
  48. package/dist/utilities/token.util.js +48 -0
  49. package/dist/validations/sample.validator.d.ts +6 -0
  50. package/dist/validations/sample.validator.js +35 -0
  51. package/package.json +12 -6
  52. package/.nvmrc +0 -1
  53. package/src/.baseDir.ts +0 -1
  54. package/src/api-response/user.response.ts +0 -30
  55. package/src/controllers/_root.control.ts +0 -138
  56. package/src/controllers/sample.control.ts +0 -8
  57. package/src/helpers/currency-formatter.helper.ts +0 -7
  58. package/src/helpers/query.helper.ts +0 -122
  59. package/src/interfaces/status.interface.ts +0 -13
  60. package/src/middlewares/auth.midware.ts +0 -41
  61. package/src/middlewares/validator.midware.ts +0 -29
  62. package/src/models/_config.ts +0 -23
  63. package/src/models/sample.model.ts +0 -21
  64. package/src/routes/index.route.ts +0 -30
  65. package/src/routes/sample.route.ts +0 -51
  66. package/src/server.ts +0 -49
  67. package/src/services/_root.service.ts +0 -70
  68. package/src/services/sample.service.ts +0 -105
  69. package/src/utilities/date.util.ts +0 -68
  70. package/src/utilities/logger.util.ts +0 -52
  71. package/src/utilities/token.util.ts +0 -20
  72. package/src/validations/sample.validator.ts +0 -8
  73. package/tsconfig.json +0 -15
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sample_control_1 = __importDefault(require("../controllers/sample.control"));
7
+ const _root_service_1 = require("./_root.service");
8
+ const status_interface_1 = require("../interfaces/status.interface");
9
+ const { SUCCESS, ERROR, UNPROCESSABLE_ENTRY, PRECONDITION_FAILED, SUCCESS_NO_CONTENT } = status_interface_1.Status;
10
+ class SampleService extends _root_service_1.RootService {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.create = async (req, res) => {
14
+ const actionType = 'CREATE_SAMPLE';
15
+ try {
16
+ const sample = await sample_control_1.default.create(req.body);
17
+ this.sendResponse({ req, res, status: SUCCESS, data: sample, actionType });
18
+ }
19
+ catch (error) {
20
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
21
+ }
22
+ };
23
+ this.getAll = async (req, res) => {
24
+ const actionType = 'GET_ALL_SAMPLES';
25
+ try {
26
+ const samples = await sample_control_1.default.fetchAll({}, req.query);
27
+ this.sendResponse({ req, res, status: SUCCESS, actionType, data: samples });
28
+ }
29
+ catch (error) {
30
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
31
+ }
32
+ };
33
+ this.getOne = async (req, res) => {
34
+ const actionType = 'GET_ONE_SAMPLE';
35
+ try {
36
+ const sample = await sample_control_1.default.getOne(req.query);
37
+ this.sendResponse({ req, res, status: SUCCESS, actionType, data: sample });
38
+ }
39
+ catch (error) {
40
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
41
+ }
42
+ };
43
+ this.getById = async (req, res) => {
44
+ const actionType = 'GET_SAMPLE_BY_ID';
45
+ try {
46
+ const sample = await sample_control_1.default.getById(req.params.id);
47
+ this.sendResponse({ req, res, status: SUCCESS, actionType, data: sample });
48
+ }
49
+ catch (error) {
50
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
51
+ }
52
+ };
53
+ this.updateOne = async (req, res) => {
54
+ const actionType = 'UPDATE_ONE_SAMPLE';
55
+ try {
56
+ const sample = await sample_control_1.default.updateOne(req.query, req.body);
57
+ if (sample.acknowledged)
58
+ return this.sendResponse({ req, res, status: SUCCESS, actionType, data: sample });
59
+ this.sendResponse({ req, res, status: UNPROCESSABLE_ENTRY, actionType, data: 'data not updated' });
60
+ }
61
+ catch (error) {
62
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
63
+ }
64
+ };
65
+ this.updateMany = async (req, res) => {
66
+ const actionType = 'UPDATE_MANY_SAMPLE';
67
+ try {
68
+ const sample = await sample_control_1.default.updateMany(req.query, req.body);
69
+ if (sample.acknowledged)
70
+ return this.sendResponse({ req, res, status: SUCCESS, actionType, data: sample });
71
+ this.sendResponse({ req, res, status: UNPROCESSABLE_ENTRY, actionType, data: 'data not updated' });
72
+ }
73
+ catch (error) {
74
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
75
+ }
76
+ };
77
+ this.updateById = async (req, res) => {
78
+ const actionType = 'UPDATE_SAMPLE_BY_ID';
79
+ try {
80
+ const sample = await sample_control_1.default.updateById(req.params.id, req.body);
81
+ if (sample)
82
+ return this.sendResponse({ req, res, status: SUCCESS, actionType, data: sample });
83
+ this.sendResponse({ req, res, status: PRECONDITION_FAILED, actionType, data: 'data not updated' });
84
+ }
85
+ catch (error) {
86
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
87
+ }
88
+ };
89
+ this.deleteOne = async (req, res) => {
90
+ const actionType = 'DELETE_ONE_SAMPLE';
91
+ try {
92
+ const sample = await sample_control_1.default.deleteOne(req.query);
93
+ if (sample.acknowledged)
94
+ return this.sendResponse({ req, res, status: SUCCESS_NO_CONTENT, actionType, data: sample });
95
+ this.sendResponse({ req, res, status: UNPROCESSABLE_ENTRY, actionType, data: 'data not deleted' });
96
+ }
97
+ catch (error) {
98
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
99
+ }
100
+ };
101
+ this.deleteMany = async (req, res) => {
102
+ const actionType = 'DELETE_MANY_SAMPLES';
103
+ try {
104
+ const sample = await sample_control_1.default.deleteMany(req.query);
105
+ if (sample.acknowledged)
106
+ return this.sendResponse({ req, res, status: SUCCESS_NO_CONTENT, actionType, data: sample });
107
+ this.sendResponse({ req, res, status: UNPROCESSABLE_ENTRY, actionType, data: 'data not deleted' });
108
+ }
109
+ catch (error) {
110
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
111
+ }
112
+ };
113
+ this.deleteById = async (req, res) => {
114
+ const actionType = 'DELETE_SAMPLE_BY_ID';
115
+ try {
116
+ const sample = await sample_control_1.default.deleteById(req.params.id);
117
+ if (sample)
118
+ return this.sendResponse({ req, res, status: SUCCESS_NO_CONTENT, actionType, data: sample });
119
+ this.sendResponse({ req, res, status: PRECONDITION_FAILED, actionType, data: 'data not deleted' });
120
+ }
121
+ catch (error) {
122
+ this.sendResponse({ req, res, status: ERROR, actionType, data: error });
123
+ }
124
+ };
125
+ }
126
+ }
127
+ exports.default = new SampleService;
@@ -0,0 +1,42 @@
1
+ declare class DateUtil_ {
2
+ get_local_date: (date?: Date) => Date;
3
+ get_start_date(date: any): number;
4
+ get_end_date(date: any): number;
5
+ get_date_format(date: Date, format: string): Date;
6
+ get_today_date_range(payload?: {
7
+ format?: string;
8
+ date: Date;
9
+ }): {
10
+ start_date: any;
11
+ end_date: any;
12
+ };
13
+ get_date_range(payload?: {
14
+ format?: string;
15
+ date: Date;
16
+ number_of_days?: number;
17
+ }): {
18
+ start_date: any;
19
+ end_date: any;
20
+ };
21
+ get_custom_date_range({ start_date, end_date }: {
22
+ start_date: Date;
23
+ end_date: Date;
24
+ }): {
25
+ start_date: Date;
26
+ end_date: Date;
27
+ };
28
+ this_week_date_range(): {
29
+ start_date: Date;
30
+ end_date: Date;
31
+ };
32
+ this_month_date_range(): {
33
+ start_date: Date;
34
+ end_date: Date;
35
+ };
36
+ this_year_date_range(): {
37
+ start_date: Date;
38
+ end_date: Date;
39
+ };
40
+ }
41
+ declare const DateUtil: DateUtil_;
42
+ export { DateUtil };
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.DateUtil = void 0;
27
+ const dateFns = __importStar(require("date-fns"));
28
+ class DateUtil_ {
29
+ constructor() {
30
+ this.get_local_date = (date = new Date()) => {
31
+ const currentDate = new Date(date);
32
+ // const localOffset = currentDate.getTimezoneOffset() * 60000;
33
+ // const localDate = new Date(currentDate.getTime() - localOffset);
34
+ return currentDate;
35
+ };
36
+ }
37
+ get_start_date(date) {
38
+ const d = this.get_local_date(date);
39
+ d.setHours(0, 0, 0, 0);
40
+ return d.getTime();
41
+ }
42
+ get_end_date(date) {
43
+ const d = this.get_local_date(date);
44
+ d.setHours(23, 0, 0, 0);
45
+ return d.getTime();
46
+ }
47
+ get_date_format(date, format) {
48
+ return this.get_local_date(date);
49
+ }
50
+ get_today_date_range(payload) {
51
+ const main_date = payload && payload.date ? this.get_local_date(payload.date) : this.get_local_date();
52
+ return {
53
+ start_date: dateFns.startOfDay(main_date),
54
+ end_date: dateFns.endOfDay(main_date)
55
+ };
56
+ }
57
+ get_date_range(payload) {
58
+ const main_date = payload && payload.date ? this.get_local_date(payload.date) : this.get_local_date();
59
+ const number_of_days = payload?.number_of_days ? payload.number_of_days : 0;
60
+ const start_date = dateFns.subDays(main_date, number_of_days);
61
+ const end_date = dateFns.addDays(main_date, number_of_days);
62
+ return {
63
+ start_date: dateFns.startOfDay(start_date),
64
+ end_date: dateFns.endOfDay(end_date)
65
+ };
66
+ }
67
+ get_custom_date_range({ start_date, end_date }) {
68
+ return {
69
+ start_date: dateFns.startOfDay(this.get_local_date(start_date)),
70
+ end_date: dateFns.endOfDay(this.get_local_date(end_date))
71
+ };
72
+ }
73
+ this_week_date_range() {
74
+ return {
75
+ start_date: dateFns.startOfWeek(this.get_local_date()),
76
+ end_date: dateFns.endOfWeek(this.get_local_date())
77
+ };
78
+ }
79
+ this_month_date_range() {
80
+ return {
81
+ start_date: dateFns.startOfMonth(this.get_local_date()),
82
+ end_date: dateFns.endOfMonth(this.get_local_date())
83
+ };
84
+ }
85
+ this_year_date_range() {
86
+ return {
87
+ start_date: dateFns.startOfYear(this.get_local_date()),
88
+ end_date: dateFns.endOfYear(this.get_local_date())
89
+ };
90
+ }
91
+ }
92
+ const DateUtil = new DateUtil_;
93
+ exports.DateUtil = DateUtil;
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ declare const morgan: (req: import("http").IncomingMessage, res: import("http").ServerResponse, callback: (err?: Error | undefined) => void) => void;
3
+ declare const winston: import("winston").Logger;
4
+ export { morgan, winston };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.winston = exports.morgan = void 0;
7
+ const env_1 = __importDefault(require("../env"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const morgan_1 = __importDefault(require("morgan"));
11
+ const winston_1 = require("winston");
12
+ class LoggerUtil {
13
+ morgan() {
14
+ let dev_format = '[:date[web] :remote-addr :remote-user ] :method :url HTTP/:http-version | :status :response-time ms';
15
+ let prod_format = '[:date[web] :remote-addr :remote-user ] :method :url HTTP/:http-version :referrer - :user-agent | :status :response-time ms';
16
+ let morgan_format = env_1.default.NODE_ENV === 'prod' ? prod_format : dev_format;
17
+ let request_log_stream = (0, fs_1.createWriteStream)((0, path_1.resolve)(__dirname, `../../logs/request.log`), { flags: 'a' });
18
+ return (0, morgan_1.default)(morgan_format, { stream: request_log_stream });
19
+ }
20
+ winston() {
21
+ let { colorize, combine, printf, timestamp } = winston_1.format;
22
+ let log_transports = {
23
+ console: new winston_1.transports.Console({ level: 'warn' }),
24
+ combined_log: new winston_1.transports.File({ level: 'info', filename: `logs/combined.log` }),
25
+ error_log: new winston_1.transports.File({ level: 'error', filename: `logs/error.log` }),
26
+ exception_log: new winston_1.transports.File({ filename: 'logs/exception.log' }),
27
+ };
28
+ let log_format = printf(({ level, message, timestamp }) => `[${timestamp} : ${level}] - ${message}`);
29
+ let logger = (0, winston_1.createLogger)({
30
+ transports: [
31
+ log_transports.console,
32
+ log_transports.combined_log,
33
+ log_transports.error_log,
34
+ ],
35
+ exceptionHandlers: [
36
+ log_transports.exception_log,
37
+ ],
38
+ exitOnError: false,
39
+ format: combine(colorize(), timestamp(), log_format)
40
+ });
41
+ return logger;
42
+ }
43
+ }
44
+ const loggerUtil = new LoggerUtil();
45
+ const morgan = loggerUtil.morgan();
46
+ exports.morgan = morgan;
47
+ const winston = loggerUtil.winston();
48
+ exports.winston = winston;
@@ -0,0 +1,6 @@
1
+ declare class TokenUtil {
2
+ sign_admin_user(payload: any, expiresIn: string | number): string;
3
+ verify_admin_user(token: string): any;
4
+ }
5
+ declare const _default: TokenUtil;
6
+ export default _default;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const jwt = __importStar(require("jsonwebtoken"));
30
+ const env_1 = __importDefault(require("../env"));
31
+ const user_response_1 = require("../api-response/user.response");
32
+ class TokenUtil {
33
+ sign_admin_user(payload, expiresIn) {
34
+ return jwt.sign(payload, env_1.default?.ADMIN_JWT_KEY, { expiresIn: expiresIn ? expiresIn : '1d' });
35
+ }
36
+ verify_admin_user(token) {
37
+ return new Promise((resolve, reject) => {
38
+ try {
39
+ const resp = jwt.verify(token, env_1.default.ADMIN_JWT_KEY);
40
+ resolve(resp);
41
+ }
42
+ catch (error) {
43
+ reject({ error, ...user_response_1.UserApiResp.NOT_AUTHORIZED });
44
+ }
45
+ });
46
+ }
47
+ }
48
+ exports.default = new TokenUtil;
@@ -0,0 +1,6 @@
1
+ import * as joi from 'joi';
2
+ declare class SampleValidator {
3
+ create: joi.ObjectSchema<any>;
4
+ }
5
+ declare const _default: SampleValidator;
6
+ export default _default;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const joi = __importStar(require("joi"));
27
+ class SampleValidator {
28
+ constructor() {
29
+ this.create = joi.object({
30
+ name: joi.string().required(),
31
+ description: joi.string().required()
32
+ });
33
+ }
34
+ }
35
+ exports.default = new SampleValidator;
package/package.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "@vasrefil/api-toolkit",
3
3
  "description": "This is Vasrefil API toolkit",
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "author": "Sodiq Alabi",
6
- "main": "server.js",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
7
8
  "scripts": {
8
- "start": "ts-node-dev src/server.ts",
9
+ "start": "ts-node-dev src/index.ts",
9
10
  "build": "tsc",
10
- "serve": "node dist/server.js",
11
- "dev": "nodemon --exec ts-node src/server.ts",
11
+ "prepare": "npm run build",
12
+ "serve": "node dist/index.js",
13
+ "dev": "nodemon --exec ts-node src/index.ts",
12
14
  "run-ts-node": "ts-node-dev"
13
15
  },
14
16
  "engines": {
@@ -48,5 +50,9 @@
48
50
  "ts-node": "^10.9.2",
49
51
  "ts-node-dev": "^2.0.0",
50
52
  "typescript": "^5.3.3"
51
- }
53
+ },
54
+ "files": [
55
+ "dist",
56
+ "README.md"
57
+ ]
52
58
  }
package/.nvmrc DELETED
@@ -1 +0,0 @@
1
- 20.11.0
package/src/.baseDir.ts DELETED
@@ -1 +0,0 @@
1
- // grunt-ts creates this file to help TypeScript find the compilation root of your project. If you wish to get to stop creating it, specify a `rootDir` setting in the Gruntfile ts `options`. See https://github.com/TypeStrong/grunt-ts#rootdir for details. Note that `rootDir` goes under `options`, and is case-sensitive. This message was revised in grunt-ts v6. Note that `rootDir` requires TypeScript 1.5 or higher.
@@ -1,30 +0,0 @@
1
- import { Status } from '../interfaces/status.interface';
2
- export const UserApiResp = {
3
- NO_AUTHORIZATION_HEADER: {
4
- code: 'NAH0401', status: Status.UN_AUTHORIZED, message: 'Please specify authorization header'
5
- },
6
- NOT_AUTHORIZED: {
7
- code: 'NA00401', status: Status.UN_AUTHORIZED, message: 'You are not authorized'
8
- },
9
- USER_NOT_FOUND: {
10
- code: 'UNF0401', status: Status.UN_AUTHORIZED, message: 'User not found'
11
- },
12
- USER_DEACTIVATED: {
13
- code: 'UD00401', status: Status.UN_AUTHORIZED, message: 'Your account has been deactivated'
14
- },
15
- UNVERIFIED_EMAIL: {
16
- code: 'UE00403', status: Status.FORBIDDEN, message: 'Your email address is not verified'
17
- },
18
- UNCOMPELETE_ACCOUNT_SETUP: {
19
- code: 'UAS0403', status: Status.FORBIDDEN, message: 'Account setup is not completed'
20
- },
21
- UNCOMPELETE_PIN_SETUP: {
22
- code: 'UPS0403', status: Status.FORBIDDEN, message: 'Pin setup is not completed'
23
- },
24
- NO_PIN_TOKEN_HEADER: {
25
- code: 'NPTH401', status: Status.UN_AUTHORIZED, message: 'Please specify pin_token header'
26
- },
27
- EXPIRED_PIN_TOKEN: {
28
- code: 'EPT0401', status: Status.UN_AUTHORIZED, message: 'Your session has expired, Please login with your pin'
29
- },
30
- }
@@ -1,138 +0,0 @@
1
- import { Model, Document, } from 'mongoose';
2
- import { QueryHelper } from '../helpers/query.helper';
3
- import { FetchAllQuery, FetchWithPaginationDataI, ModelPopulateI, NestedRecordQueryOptionsI } from '../interfaces/root-controller.interface';
4
-
5
- export class RootController {
6
- private model: Model<any>;
7
- private modelName: string;
8
- constructor(model: Model<any>, modelName: string = 'Document') {
9
- this.model = model;
10
- this.modelName = modelName;
11
- }
12
- unique = async (conditions: {key: string, value: string}) => {
13
- const {key, value} = conditions;
14
- const res = await this.model.findOne({[key]: value});
15
- if(res) {
16
- return false
17
- } else {
18
- return true;
19
- }
20
- }
21
- getDocumentCount = async (conditon = {}, query?: object) => {
22
- const { filter } = QueryHelper.build_query(query);
23
- return await this.model.countDocuments({...filter, ...conditon})
24
- }
25
- create = async (payload: any) => {
26
- try {
27
- const document = await(this.model.create({...payload}))
28
- return document.toJSON()
29
- } catch (error) {
30
- throw error;
31
- }
32
- }
33
- fetchAll(condition: object = {}, query?: FetchAllQuery, select: string|object = '', populate?: any) {
34
- const { filter, skip, limit, sort } = QueryHelper.build_query(query);
35
- return this.model.find({...filter, ...condition}).select(select).skip(skip).limit(limit).sort(sort).populate(populate);
36
- }
37
- fetchAllWithPagination = async (
38
- conditon: object,
39
- query?: FetchAllQuery,
40
- select: string|object = '',
41
- populate?: ModelPopulateI[]): Promise<FetchWithPaginationDataI> => {
42
- try {
43
- const records = await this.fetchAll(conditon, query, select, populate);
44
- const total_records = await this.getDocumentCount(conditon, query);
45
- return {records, total_records}
46
- } catch (error) {
47
- throw error
48
- }
49
- }
50
- getOneP = async (condition: object, select?: any) => {
51
- try {
52
- select = select ? select : '';
53
- const document = await this.model.findOne(condition).select(select).lean()
54
- if(!document) throw {message: `${this.modelName} not found`};
55
- return document
56
- } catch (error) {
57
- throw error;
58
- }
59
- }
60
- getOne(condition: object, select: string|object = '', populate?: any) {
61
- return (this.model.findOne(condition).select(select).populate(populate).lean() as any)
62
- }
63
-
64
-
65
- getById = async (id: string, select: string|object = '') => {
66
- try {
67
- const document = await this.model.findById(id).select(select).lean()
68
- if(!document) throw {message: `${this.modelName} not found`};
69
- return document;
70
- } catch (error) {
71
- throw error
72
- }
73
- }
74
- updateOne(condition: object, updateValues: object) {
75
- return (this.model.updateOne({...condition}, {...updateValues}, {new: true}) as any)
76
- }
77
- updateMany(condition: object, updateValues: object) {
78
- return this.model.updateMany({...condition}, {...updateValues}).lean()
79
- }
80
- updateById(id: string, updateValues: object): any {
81
- return this.model.findByIdAndUpdate(id, {...updateValues}, {new: true}).lean()
82
- }
83
- deleteOne(condition: object) {
84
- return this.model.deleteOne({...condition})
85
- }
86
- deleteMany(condition: object) {
87
- return this.model.deleteMany({...condition})
88
- }
89
- deleteById(id: string) {
90
- return this.model.findByIdAndDelete(id)
91
- }
92
- search = async (payload:{key: any, value: any}, select = '') => {
93
- try {
94
- const regrex = new RegExp(`${payload.value}`, 'i');
95
- const records = await this.model.find({[payload.key]: {$regex: regrex}}).select(select);
96
- if(!records) throw {message: `${this.modelName} not found`}
97
- throw records;
98
- } catch (error) {
99
- throw error;
100
- }
101
- }
102
- getNestedRecord = async (
103
- options: NestedRecordQueryOptionsI,
104
- errorMessage?: string
105
- ) => {
106
- const {
107
- parentField,
108
- childIdField = '_id',
109
- parentId,
110
- childId
111
- } = options;
112
-
113
- // Build the query
114
- const query = {
115
- _id: parentId,
116
- [`${parentField}.${childIdField}`]: { $eq: childId }
117
- };
118
-
119
- // Build the projection
120
- const projection = {
121
- [parentField]: {
122
- $elemMatch: {
123
- [childIdField]: childId
124
- }
125
- }
126
- };
127
-
128
- // Execute the query
129
- const result = await this.model.findOne(query, projection);
130
-
131
- if (!result) {
132
- throw new Error(errorMessage || `Nested record not found in ${parentField}`);
133
- }
134
-
135
- // Return the first element of the matched array
136
- return result[parentField][0];
137
- }
138
- }
@@ -1,8 +0,0 @@
1
- import { RootController } from './_root.control';
2
- import SampleModel from '../models/sample.model'
3
- class SampleController extends RootController {
4
- constructor() {
5
- super(SampleModel)
6
- }
7
- }
8
- export default new SampleController
@@ -1,7 +0,0 @@
1
- export const currency_fmt = (value: any): string => {
2
- const result = new Intl.NumberFormat('en-NG', {
3
- style: 'currency',
4
- currency: 'NGN',
5
- }).format(value)
6
- return result
7
- }