mirror of
				https://github.com/Mueller-Patrick/Betterzon.git
				synced 2025-10-31 16:55:49 +00:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			3874957d5a
			...
			0be394fc1d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 0be394fc1d | ||
|  | cd0c11dbc7 | ||
|  | f333bbfc05 | 
|  | @ -14,6 +14,7 @@ import {vendorsRouter} from './models/vendors/vendors.router'; | ||||||
| import {errorHandler} from './middleware/error.middleware'; | import {errorHandler} from './middleware/error.middleware'; | ||||||
| import {notFoundHandler} from './middleware/notFound.middleware'; | import {notFoundHandler} from './middleware/notFound.middleware'; | ||||||
| import {usersRouter} from './models/users/users.router'; | import {usersRouter} from './models/users/users.router'; | ||||||
|  | import {pricealarmsRouter} from './models/pricealarms/pricealarms.router'; | ||||||
| 
 | 
 | ||||||
| dotenv.config(); | dotenv.config(); | ||||||
| 
 | 
 | ||||||
|  | @ -44,6 +45,7 @@ app.use('/manufacturers', manufacturersRouter); | ||||||
| app.use('/prices', pricesRouter); | app.use('/prices', pricesRouter); | ||||||
| app.use('/users', usersRouter); | app.use('/users', usersRouter); | ||||||
| app.use('/vendors', vendorsRouter); | app.use('/vendors', vendorsRouter); | ||||||
|  | app.use('/pricealarms', pricealarmsRouter); | ||||||
| 
 | 
 | ||||||
| app.use(errorHandler); | app.use(errorHandler); | ||||||
| app.use(notFoundHandler); | app.use(notFoundHandler); | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								Backend/src/models/pricealarms/pricealarm.interface.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Backend/src/models/pricealarms/pricealarm.interface.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | export interface PriceAlarm { | ||||||
|  |     alarm_id: number; | ||||||
|  |     user_id: number; | ||||||
|  |     product_id: number; | ||||||
|  |     defined_price: number; | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								Backend/src/models/pricealarms/pricealarms.interface.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Backend/src/models/pricealarms/pricealarms.interface.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | import {PriceAlarm} from './pricealarm.interface'; | ||||||
|  | 
 | ||||||
|  | export interface PriceAlarms { | ||||||
|  |     [key: number]: PriceAlarm; | ||||||
|  | } | ||||||
							
								
								
									
										129
									
								
								Backend/src/models/pricealarms/pricealarms.router.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Backend/src/models/pricealarms/pricealarms.router.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,129 @@ | ||||||
|  | /** | ||||||
|  |  * Required External Modules and Interfaces | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import express, {Request, Response} from 'express'; | ||||||
|  | import * as PriceAlarmsService from './pricealarms.service'; | ||||||
|  | import {PriceAlarm} from './pricealarm.interface'; | ||||||
|  | import {PriceAlarms} from './pricealarms.interface'; | ||||||
|  | import * as UserService from '../users/users.service'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Router Definition | ||||||
|  |  */ | ||||||
|  | export const pricealarmsRouter = express.Router(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Controller Definitions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | //GET pricealarms/
 | ||||||
|  | pricealarmsRouter.get('/', async (req: Request, res: Response) => { | ||||||
|  |     try { | ||||||
|  |         // Authenticate user
 | ||||||
|  |         const session_id = req.body.session_id; | ||||||
|  |         const session_key = req.body.session_key; | ||||||
|  |         const user_ip = req.connection.remoteAddress ?? ''; | ||||||
|  | 
 | ||||||
|  |         if (!session_id || !session_key) { | ||||||
|  |             // Missing
 | ||||||
|  |             res.status(400).send(JSON.stringify({message: 'Missing parameters'})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const user = await UserService.checkSession(session_id, session_key, user_ip); | ||||||
|  | 
 | ||||||
|  |         const priceAlarms = await PriceAlarmsService.getPriceAlarms(user.user_id); | ||||||
|  | 
 | ||||||
|  |         res.status(200).send(priceAlarms); | ||||||
|  |     } catch (e) { | ||||||
|  |         console.log('Error handling a request: ' + e.message); | ||||||
|  |         res.status(500).send(JSON.stringify({'message': 'Internal Server Error. Try again later.'})); | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // POST pricealarms/create
 | ||||||
|  | pricealarmsRouter.post('/create', async (req: Request, res: Response) => { | ||||||
|  |     try { | ||||||
|  |         // Authenticate user
 | ||||||
|  |         const session_id = req.body.session_id; | ||||||
|  |         const session_key = req.body.session_key; | ||||||
|  |         const user_ip = req.connection.remoteAddress ?? ''; | ||||||
|  | 
 | ||||||
|  |         if (!session_id || !session_key) { | ||||||
|  |             // Missing
 | ||||||
|  |             res.status(400).send(JSON.stringify({message: 'Missing parameters'})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const user = await UserService.checkSession(session_id, session_key, user_ip); | ||||||
|  | 
 | ||||||
|  |         // Get info for price alarm creation
 | ||||||
|  |         const product_id = req.body.product_id; | ||||||
|  |         const defined_price = req.body.defined_price; | ||||||
|  | 
 | ||||||
|  |         if (!product_id || !defined_price) { | ||||||
|  |             // Missing
 | ||||||
|  |             res.status(400).send(JSON.stringify({message: 'Missing parameters'})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Create price alarm
 | ||||||
|  |         const success = await PriceAlarmsService.createPriceAlarm(user.user_id, product_id, defined_price); | ||||||
|  | 
 | ||||||
|  |         if (success) { | ||||||
|  |             res.status(201).send(JSON.stringify({success: true})); | ||||||
|  |             return; | ||||||
|  |         } else { | ||||||
|  |             res.status(500).send(JSON.stringify({success: false})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } catch (e) { | ||||||
|  |         console.log('Error handling a request: ' + e.message); | ||||||
|  |         res.status(500).send(JSON.stringify({'message': 'Internal Server Error. Try again later.'})); | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // PUT pricealarms/update
 | ||||||
|  | pricealarmsRouter.put('/update', async (req: Request, res: Response) => { | ||||||
|  |     try { | ||||||
|  |         // Authenticate user
 | ||||||
|  |         const session_id = req.body.session_id; | ||||||
|  |         const session_key = req.body.session_key; | ||||||
|  |         const user_ip = req.connection.remoteAddress ?? ''; | ||||||
|  | 
 | ||||||
|  |         if (!session_id || !session_key) { | ||||||
|  |             // Missing
 | ||||||
|  |             res.status(400).send(JSON.stringify({message: 'Missing parameters'})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const user = await UserService.checkSession(session_id, session_key, user_ip); | ||||||
|  | 
 | ||||||
|  |         // Get info for price alarm creation
 | ||||||
|  |         const alarm_id = req.body.alarm_id; | ||||||
|  |         const defined_price = req.body.defined_price; | ||||||
|  | 
 | ||||||
|  |         if (!alarm_id || !defined_price) { | ||||||
|  |             // Missing
 | ||||||
|  |             res.status(400).send(JSON.stringify({message: 'Missing parameters'})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Create price alarm
 | ||||||
|  |         const success = await PriceAlarmsService.updatePriceAlarm(alarm_id, user.user_id, defined_price); | ||||||
|  | 
 | ||||||
|  |         if (success) { | ||||||
|  |             res.status(201).send(JSON.stringify({success: true})); | ||||||
|  |             return; | ||||||
|  |         } else { | ||||||
|  |             res.status(500).send(JSON.stringify({success: false})); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } catch (e) { | ||||||
|  |         console.log('Error handling a request: ' + e.message); | ||||||
|  |         res.status(500).send(JSON.stringify({'message': 'Internal Server Error. Try again later.'})); | ||||||
|  |     } | ||||||
|  | }); | ||||||
							
								
								
									
										106
									
								
								Backend/src/models/pricealarms/pricealarms.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								Backend/src/models/pricealarms/pricealarms.service.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,106 @@ | ||||||
|  | import * as dotenv from 'dotenv'; | ||||||
|  | 
 | ||||||
|  | dotenv.config(); | ||||||
|  | 
 | ||||||
|  | const mariadb = require('mariadb'); | ||||||
|  | const pool = mariadb.createPool({ | ||||||
|  |     host: process.env.DB_HOST, | ||||||
|  |     user: process.env.DB_USER, | ||||||
|  |     password: process.env.DB_PASSWORD, | ||||||
|  |     database: process.env.DB_DATABASE, | ||||||
|  |     connectionLimit: 5 | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Data Model Interfaces | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | import {PriceAlarm} from './pricealarm.interface'; | ||||||
|  | import {PriceAlarms} from './pricealarms.interface'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Service Methods | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Creates a price alarm for the given user for the product with the defined price | ||||||
|  |  * @param user_id The id of the user to create the price alarm for | ||||||
|  |  * @param product_id The id of the product to create the price alarm for | ||||||
|  |  * @param defined_price The defined price for the price alarm | ||||||
|  |  */ | ||||||
|  | export const createPriceAlarm = async (user_id: number, product_id: number, defined_price: number): Promise<Boolean> => { | ||||||
|  |     let conn; | ||||||
|  |     try { | ||||||
|  |         conn = await pool.getConnection(); | ||||||
|  |         const res = await conn.query('INSERT INTO price_alarms (user_id, product_id, defined_price) VALUES (?, ?, ?)', [user_id, product_id, defined_price]); | ||||||
|  | 
 | ||||||
|  |         if (res.affectedRows === 1) { | ||||||
|  |             return true; | ||||||
|  |         } else { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } catch (err) { | ||||||
|  |         throw err; | ||||||
|  |     } finally { | ||||||
|  |         if (conn) { | ||||||
|  |             conn.end(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Fetches and returns all price alarms for the given user | ||||||
|  |  * @param user_id | ||||||
|  |  */ | ||||||
|  | export const getPriceAlarms = async (user_id: number): Promise<PriceAlarms> => { | ||||||
|  |     let conn; | ||||||
|  |     let priceAlarms = []; | ||||||
|  |     try { | ||||||
|  |         conn = await pool.getConnection(); | ||||||
|  |         const rows = await conn.query('SELECT alarm_id, user_id, product_id, defined_price FROM price_alarms WHERE user_id = ?', user_id); | ||||||
|  |         for (let row in rows) { | ||||||
|  |             if (row !== 'meta') { | ||||||
|  |                 priceAlarms.push(rows[row]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return priceAlarms; | ||||||
|  |     } catch (err) { | ||||||
|  |         throw err; | ||||||
|  |     } finally { | ||||||
|  |         if (conn) { | ||||||
|  |             conn.end(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Updates the given price alarm with the given fields | ||||||
|  |  * @param alarm_id The id of the price alarm to update | ||||||
|  |  * @param user_id The id of the user that wants to update the price alarm | ||||||
|  |  * @param defined_price The defined price for the price alarm | ||||||
|  |  */ | ||||||
|  | export const updatePriceAlarm = async (alarm_id: number, user_id: number, defined_price: number): Promise<Boolean> => { | ||||||
|  |     let conn; | ||||||
|  |     try { | ||||||
|  |         conn = await pool.getConnection(); | ||||||
|  |         const res = await conn.query('UPDATE price_alarms SET defined_price = ? WHERE alarm_id = ? AND user_id = ?', [defined_price, alarm_id, user_id]); | ||||||
|  | 
 | ||||||
|  |         if (res.affectedRows === 1) { | ||||||
|  |             return true; | ||||||
|  |         } else { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } catch (err) { | ||||||
|  |         throw err; | ||||||
|  |     } finally { | ||||||
|  |         if (conn) { | ||||||
|  |             conn.end(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | }; | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|     <modelVersion>4.0.0</modelVersion> |     <modelVersion>4.0.0</modelVersion> | ||||||
| 
 | 
 | ||||||
|     <groupId>de.taskhub</groupId> |     <groupId>xyz.betterzon</groupId> | ||||||
|     <artifactId>CucumberTests</artifactId> |     <artifactId>CucumberTests</artifactId> | ||||||
|     <version>1.0-SNAPSHOT</version> |     <version>1.0-SNAPSHOT</version> | ||||||
|     <properties> |     <properties> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user