diff --git a/back-express/package-lock.json b/back-express/package-lock.json index a2a1d4a..702964b 100644 --- a/back-express/package-lock.json +++ b/back-express/package-lock.json @@ -10,7 +10,8 @@ "license": "ISC", "dependencies": { "cors": "^2.8.5", - "dotenv": "^16.4.5" + "dotenv": "^16.4.5", + "mysql2": "^3.11.3" }, "devDependencies": { "@types/cors": "^2.8.17", @@ -277,6 +278,15 @@ "dev": true, "license": "MIT" }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -496,6 +506,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -716,6 +735,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -924,6 +952,42 @@ "node": ">=0.12.0" } }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", + "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1017,6 +1081,50 @@ "dev": true, "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.11.3.tgz", + "integrity": "sha512-Qpu2ADfbKzyLdwC/5d4W7+5Yz7yBzCU05YWt5npWzACST37wJsB23wgOSo00qi043urkiRwXtEvJc9UnuLX/MQ==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1257,7 +1365,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -1315,6 +1422,11 @@ "dev": true, "license": "MIT" }, + "node_modules/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==" + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -1388,6 +1500,15 @@ "node": ">=10" } }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", diff --git a/back-express/package.json b/back-express/package.json index f56cf12..61835af 100644 --- a/back-express/package.json +++ b/back-express/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "cors": "^2.8.5", - "dotenv": "^16.4.5" + "dotenv": "^16.4.5", + "mysql2": "^3.11.3" } } diff --git a/back-express/src/db.ts b/back-express/src/db.ts new file mode 100644 index 0000000..9a123ec --- /dev/null +++ b/back-express/src/db.ts @@ -0,0 +1,28 @@ +import mysql, { QueryError } from "mysql2/promise"; +import { ResponseError } from "./utils/error/response-error.model"; + +const db_pool = mysql.createPool({ + host: "localhost", + port: 3307, + user: "dbuser", + password: "securepassword", + database: "path", +}); + +async function DB_Query( + query: string, +): Promise[] | ResponseError> { + try { + const [results, _fields] = await db_pool.query(query); + return results as T[]; + } catch (e) { + const queryError = e as QueryError; + throw new ResponseError({ + code: queryError.code, + number: queryError.errno, + detail: queryError.message, + }); + } +} + +export { db_pool as db_connection, DB_Query as db_query }; diff --git a/back-express/src/routes/index.ts b/back-express/src/routes/index.ts index 4b52a64..5cdc01b 100644 --- a/back-express/src/routes/index.ts +++ b/back-express/src/routes/index.ts @@ -2,8 +2,10 @@ import express from "express"; import { defaultRoute } from "./defaultRoute"; import { exampleRoutes } from "./example/example.routes"; +import { userRoutes } from "./users/users.routes"; export const routes = express.Router(); routes.use("/", defaultRoute); routes.use("/example", exampleRoutes); +routes.use("/users", userRoutes); diff --git a/back-express/src/routes/users/users.routes.ts b/back-express/src/routes/users/users.routes.ts index e69de29..bd2fa8e 100644 --- a/back-express/src/routes/users/users.routes.ts +++ b/back-express/src/routes/users/users.routes.ts @@ -0,0 +1,20 @@ +import { Router } from "express"; +import UserService from "./users.service"; +import { ResponseError } from "../../utils/error/response-error.model"; + +export const userRoutes = Router(); + +const userService = new UserService(); + +userRoutes.get("/", async (req, res) => { + try { + const response = await userService.getAllUsers(); + // console.log("__DB_DATA", data); + res.status(200); + res.send(response); + } catch (e) { + // const response_error = new ResponseError(e); + res.status(400); + res.send(e); + } +}); diff --git a/back-express/src/routes/users/users.service.ts b/back-express/src/routes/users/users.service.ts index d529577..0c81fca 100644 --- a/back-express/src/routes/users/users.service.ts +++ b/back-express/src/routes/users/users.service.ts @@ -1,11 +1,35 @@ +import { db_connection, db_query } from "../../db"; + class UserService { constructor() {} - getAllUsers() {} - - getUserById(id: number) { - return 3; + async getTestUsers() { + const data = await db_connection.execute("select * from user"); + return data; } + + async getAllUsers() { + try { + const data = await db_query("select * from user where user.id == 3"); + return { value: data, example: "algo" }; + } catch (e) { + return e; + } + } + + // getUserById(id: number) { + // return new Promise((resolve, reject) => + // db_connection.query("select * from user", (err, rows, fields) => { + // console.log(rows); + // if (err) { + // console.error("Mysql Error on User SELECT: ", err); + // reject(err); + // } else { + // resolve(rows); + // } + // }), + // ); + // } } export default UserService; diff --git a/back-express/src/utils/error/response-error.model.ts b/back-express/src/utils/error/response-error.model.ts new file mode 100644 index 0000000..fcadd88 --- /dev/null +++ b/back-express/src/utils/error/response-error.model.ts @@ -0,0 +1,14 @@ +export class ResponseError extends Error { + constructor( + public error: { + code: string | number; + number?: number; + detail?: string; + status?: number; + suggestion?: string; + }, + public timestamp: number = Date.now(), + ) { + super(); + } +}