Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
JWT_PRIVATE_KEY=
USER_PASSWORD_SALT=
1 change: 1 addition & 0 deletions stampa_back/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const MAX_PICTURE_UPLOAD_PER_REQUEST = 50
6 changes: 6 additions & 0 deletions stampa_back/db/db-access.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { DBAccessPrintRequest, DBAccessPrintRequestImpl } from "./printrequest-db";
import { DBAccessUser, DBAccessUserImpl } from "./user-db";

export const knexAccess = require('knex')({
Expand All @@ -12,10 +13,15 @@ export const knexAccess = require('knex')({

export abstract class DBAccessFactory {
abstract getUserAccess(): DBAccessUser
abstract getPrintRequestAccess(): DBAccessPrintRequest
}

export class DBAccessFactoryImpl extends DBAccessFactory {
getUserAccess(): DBAccessUser {
return new DBAccessUserImpl()
}

getPrintRequestAccess(): DBAccessPrintRequest {
return new DBAccessPrintRequestImpl()
}
}
49 changes: 41 additions & 8 deletions stampa_back/db/db_init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,44 @@ USE photostudio;

CREATE TABLE user(
username VARCHAR(255),
password: VARCHAR(255),
name: VARCHAR(255),
surname: VARCHAR(255),
street: VARCHAR(255),
streetnumber: VARCHAR(31),
city: VARCHAR(255),
zip: INTEGER,
phone: VARCHAR(31));
password VARCHAR(255),
name VARCHAR(255),
surname VARCHAR(255),
street VARCHAR(255),
streetnumber VARCHAR(31),
city VARCHAR(255),
zip INTEGER,
phone VARCHAR(31),
PRIMARY KEY (username)
);

CREATE TABLE print_request(
request_id INTEGER NOT NULL AUTO_INCREMENT,
status VARCHAR(15) NOT NULL, -- new, accepted, sent
request_type VARCHAR(31) NOT NULL, -- photo_batch
PRIMARY KEY (request_id)
);

CREATE TABLE print_request_client_data(
name VARCHAR(255),
surname VARCHAR(255),
street VARCHAR(255),
streetnumber VARCHAR(31),
city VARCHAR(255),
zip INTEGER,
phone VARCHAR(31),
request_id INTEGER NOT NULL,

FOREIGN KEY request_id
REFERENCES print_request(request_id)
ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE print_request_photo_batch(
request_id INTEGER NOT NULL,
photo VARCHAR(4095), -- Path to uploaded photo

FOREIGN KEY request_id
REFERENCES print_request(request_id)
ON UPDATE CASCADE ON DELETE CASCADE
);
22 changes: 22 additions & 0 deletions stampa_back/db/models/PrintRequests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export interface PrintRequest {
requestId: number,
status: PrintRequestStatus,
clientData: PrintRequestClientData
}

export interface PrintRequestPhotoBatch extends PrintRequest {
photos: string[]
}

export type PrintRequestStatus = 'new' | 'accepted' | 'sent'

export interface PrintRequestClientData {
name: string,
surname: string,
streetNumber: string,
street: string,
zipCode: string,
city: string,
phone: string,
email: string | null
}
1 change: 1 addition & 0 deletions stampa_back/db/models/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface UserWithCredentials extends User {
export interface Address {
street: string,
streetNumber: string,
// TODO: Add apartment
city: string,
zip: string
}
56 changes: 56 additions & 0 deletions stampa_back/db/printrequest-db.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { knexAccess } from './db-access';
import * as dotenv from 'dotenv'
import { PrintRequestPhotoBatch } from './models/PrintRequests';

dotenv.config()

export abstract class DBAccessPrintRequest {
// abstract getPrintRequests(status)
abstract addPhotoBatchPrintRequest(printRequest: PrintRequestPhotoBatch): Promise<void>
}

export class DBAccessPrintRequestImpl extends DBAccessPrintRequest {
printRequestTable = 'print_request'
printRequestClientDataTable = 'print_request_client_data'
printRequestPhotoBatchTable = 'print_request_photo_batch'

async addPhotoBatchPrintRequest(printRequest: PrintRequestPhotoBatch): Promise<void> {
const requestIds = await knexAccess
.table(this.printRequestClientDataTable)
.insert({
request_id: printRequest.requestId,
status: printRequest.status,
})

if (requestIds[0] <= 0) {
throw new Error("Print request insertion unsuccessful")
}

const requestId = requestIds[0]
const clientData = printRequest.clientData

await knexAccess
.table(this.printRequestClientDataTable)
.insert({
name: clientData.name,
surname: clientData.surname,
street: clientData.street,
streetnumber: clientData.streetNumber,
city: clientData.city,
zip: clientData.zipCode,
phone: clientData.phone,
request_id: requestId // Foreign key for request id
})

const insertPhotoPromises = printRequest.photos.map(photo => {
return knexAccess
.table(this.printRequestPhotoBatchTable)
.insert({
request_id: requestId,
photo: photo
});
})

await Promise.all(insertPhotoPromises)
}
}
12 changes: 9 additions & 3 deletions stampa_back/handlers/handler-factory.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
import { userLoginHandler, userSignUpHandler } from "./user-managements";
import * as printRequestHandlers from "./print-requests";
import * as userManagementHandlers from "./user-managements";
import { Request, Response } from "express"

export type ExpressHandler = (request: Request, response: Response) => void

export abstract class ExpressHandlerFactory {
abstract getUserLoginHandler(): ExpressHandler
abstract getUserSignUpHandler(): ExpressHandler
abstract getPhotoBatchPrintRequestHandler(): ExpressHandler
}

export class ExpressHandlerFactoryImpl extends ExpressHandlerFactory {
getUserLoginHandler(): ExpressHandler {
return userLoginHandler
return userManagementHandlers.userLoginHandler
}

getUserSignUpHandler(): ExpressHandler {
return userSignUpHandler
return userManagementHandlers.userSignUpHandler
}

getPhotoBatchPrintRequestHandler(): ExpressHandler {
return printRequestHandlers.postPhotoBatchPrintRequest
}
}
30 changes: 30 additions & 0 deletions stampa_back/handlers/print-requests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { randomUUID } from "crypto"
import { Request, Response } from "express"
import { getAppContext } from "../context"
import { PrintRequestClientData } from "../db/models/PrintRequests"


export async function postPhotoBatchPrintRequest(request: Request, response: Response) {
const {
photos,
clientData
} = request.body as PhotoBatchPrintRequestData

// TODO: Add validation of data

const printRequestAccess = getAppContext()
.getDBAccess()
.getPrintRequestAccess()

await printRequestAccess.addPhotoBatchPrintRequest({
requestId: 0, // Request id will be auto generated on database level
status: 'new',
clientData,
photos
})
}

interface PhotoBatchPrintRequestData {
photos: string[],
clientData: PrintRequestClientData
}
6 changes: 4 additions & 2 deletions stampa_back/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { multerMiddleware, multiplePictureUpload } from './picture_handlers'
import { destroyDBAccess } from './db/user-db'
import { getAppContext } from './context'
import * as dotenv from 'dotenv'
import * as config from './config'

dotenv.config()
const app = express()
Expand All @@ -24,8 +25,9 @@ app.get('/myorders', notImplementedHandler)

// POST PHOTOS

app.post('/imageupload', multerMiddleware.array('pictures', 3), multiplePictureUpload)
app.post('/photorequest', notImplementedHandler)
app.post('/imageupload', multerMiddleware.array('pictures', config.MAX_PICTURE_UPLOAD_PER_REQUEST), multiplePictureUpload)

app.post('/printrequest/photobatch', handlerFactory.getPhotoBatchPrintRequestHandler())


// ADMIN PANEL
Expand Down