diff --git a/BookCommunication b/BookCommunication index f2b1cfa..afdb762 160000 --- a/BookCommunication +++ b/BookCommunication @@ -1 +1 @@ -Subproject commit f2b1cfa732778b75212063b43e07c2815e89b5a1 +Subproject commit afdb76202e31e72caba63b618fba742c64c1e0a1 diff --git a/package.json b/package.json index 456ae1e..b4c211b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "microservice_book", - "version": "1.0.3", + "version": "2.0.0", "description": "", "main": "index.js", "scripts": { diff --git a/sources/main/app.ts b/sources/main/app.ts index cf7b22b..a13f8e5 100644 --- a/sources/main/app.ts +++ b/sources/main/app.ts @@ -17,8 +17,6 @@ import utilityRoute from './routes/Utility'; app.use('/utility', utilityRoute) import removeRoute from './routes/Remove'; app.use('/remove', removeRoute) -import backpackRoute from './routes/Backpack'; -app.use('/backpack', backpackRoute) export = app; \ No newline at end of file diff --git a/sources/main/interfaces/Copy.ts b/sources/main/interfaces/Copy.ts index fd46bbb..933ddc9 100644 --- a/sources/main/interfaces/Copy.ts +++ b/sources/main/interfaces/Copy.ts @@ -2,6 +2,7 @@ import * as protoGen from '../generated/book'; import proto = protoGen.book; import * as Data from './Data'; import { json } from 'body-parser'; +import { Library } from './Library'; export interface Copy { RFID: string; @@ -26,6 +27,14 @@ export function generate_protoCopy(json: Copy): proto.Copy { return new proto.Copy({RFID: json.RFID, ISBN: json.ISBN, ID_Libreria: json.ID_Libreria, Email_Proprietario: json.Email_Proprietario}) } +export function generate_protoLibrary(copies: Copy[]): proto.Library { + var copiesGen: proto.Copy[] = [] + copies.forEach(function(copy: Copy) { + copiesGen.push(generate_protoCopy(copy)) + }); + return new proto.Library({copies: copiesGen}) +} + export function verify_Basic_DataPresence(json: any): boolean { return (json.RFID && json.ISBN && json.ID_Libreria && json.Email_Proprietario) } diff --git a/sources/main/interfaces/Library.ts b/sources/main/interfaces/Library.ts index e575f72..7c668f9 100644 --- a/sources/main/interfaces/Library.ts +++ b/sources/main/interfaces/Library.ts @@ -22,10 +22,6 @@ export function assignVals_JSON(json: any): Library { return library; } -export function generate_protoLibrary(json: Library): proto.Library { - return new proto.Library({ID: json.ID, Email_Proprietario: json.Email_Proprietario}) -} - export function verify_Basic_DataPresence(json: any): boolean { return (json.ID && json.RFID) } diff --git a/sources/main/queries.ts b/sources/main/queries.ts index 4d9a496..1ab626a 100644 --- a/sources/main/queries.ts +++ b/sources/main/queries.ts @@ -113,8 +113,8 @@ export async function buyBook(RFID: string, ISBN: string, ID_libreria: number): return false; } -export async function getCopyByEmail(Email: string): Promise { - let copia = Copy.defaultCopy(); +export async function getCopyByEmail(Email: string): Promise { + var copia: Copy.Copy[] = [] try { var poolConnection = await sql.connect(conf); //connect to the database var resultSet:sql.IResult = await poolConnection.request() @@ -124,7 +124,7 @@ export async function getCopyByEmail(Email: string): Promise { return copia; // ouput row contents from default record set resultSet.recordset.forEach(function(row: any) { - copia = Copy.assignVals_JSON(row) + copia.push(Copy.assignVals_JSON(row)) }); } catch (e: any) { console.error(e); @@ -133,11 +133,11 @@ export async function getCopyByEmail(Email: string): Promise { } export async function getCopyByRFID(RFID: string): Promise { - let copia = Copy.defaultCopy(); + var copia = Copy.defaultCopy(); try { var poolConnection = await sql.connect(conf); //connect to the database var resultSet:sql.IResult = await poolConnection.request() - .query("select * from Copia where RFID = '" + RFID + "'"); //execute the query + .query("select * from Copia, Libreria where RFID = '" + RFID + "' AND Copia.ID_Libreria = Libreria.ID"); //execute the query poolConnection.close(); //close connection with database if(resultSet.rowsAffected[0] == 0) //se non è stata trovata nessuna libreria, torna quella default return copia; @@ -251,8 +251,6 @@ export async function deleteBook_Author(Author: string): Promise { return false; } - - export async function changeEmail(newEmail: string, oldEmail:string): Promise { try { var poolConnection = await sql.connect(conf); //connect to the database @@ -265,81 +263,4 @@ export async function changeEmail(newEmail: string, oldEmail:string): Promise { - try { - var poolConnection = await sql.connect(conf); //connect to the database - var resultSet:sql.IResult = await poolConnection.request() - .query("Insert into Backpack values ('" + RFID + "', " + ID_Libreria + ")"); //execute the query - poolConnection.close(); //close connection with database - // ouput row contents from default record set - return resultSet.rowsAffected[0] == 1; - } catch (e: any) { - console.error(e); - } - return false; -} - -export async function removeCopyfromBackpack(RFID: string): Promise { - try { - var poolConnection = await sql.connect(conf); //connect to the database - await poolConnection.request().query("delete from Backpack where RFID='" + RFID + "'"); //execute the query - poolConnection.close(); //close connection with database - // ouput row contents from default record set - return true; - } catch (e: any) { - console.error(e); - } - return false; -} - -export async function removeAllCopyfromBackpackByEmail(email: string): Promise { - const library: Library.Library = await getLibreriaByEmail(email) - try { - var poolConnection = await sql.connect(conf); //connect to the database - await poolConnection.request().query("delete from Backpack where ID_Libreria="+ library.ID); //execute the query - poolConnection.close(); //close connection with database - // ouput row contents from default record set - return true; - } catch (e: any) { - console.error(e); - } - return false; -} - -export async function getBackpackRFIDsByEmail(email: string): Promise { - const library: Library.Library = await getLibreriaByEmail(email) - var RFIDS: string[] = [] - try { - var poolConnection = await sql.connect(conf); //connect to the database - const resultSet = await poolConnection.request().query("select * from Backpack where ID_Libreria=" + library.ID); //execute the query - poolConnection.close(); //close connection with database - // ouput row contents from default record set - resultSet.recordset.forEach(function(row: any) { - RFIDS.push(row.RFID) - }); - return RFIDS; - } catch (e: any) { - console.error(e); - } - return ["-1"]; -} - -export async function getBackpackISBNByEmail(email: string): Promise { - const library: Library.Library = await getLibreriaByEmail(email) - var ISBN: string[] = [] - try { - var poolConnection = await sql.connect(conf); //connect to the database - const resultSet = await poolConnection.request().query("select Copia.ISBN from Backpack, Copia where Backpack.ID_Libreria=" + library.ID + " AND Backpack.RFID = Copia.RFID"); //execute the query - poolConnection.close(); //close connection with database - // ouput row contents from default record set - resultSet.recordset.forEach(function(row: any) { - ISBN.push(row.ISBN) - }); - return ISBN; - } catch (e: any) { - console.error(e); - } - return ["-1"]; } \ No newline at end of file diff --git a/sources/main/routes/Backpack.ts b/sources/main/routes/Backpack.ts deleted file mode 100644 index 5e7efcc..0000000 --- a/sources/main/routes/Backpack.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Router } from 'express'; -import * as queryAsk from '../queries' -const router = Router(); -export default router; - -import * as Copy from '../interfaces/Copy'; - -import * as protoGen from '../generated/book' -import * as protoGen2 from '../generated/access' -import proto = protoGen.book -import proto2 = protoGen2.access - -router.put('/addCopies', async (req: {body: proto.multipleRFID}, res) => { - if(req.body.RFID.length == 0) { - res.status(400).send(new proto.BasicMessage({message: "You need to add at least 1 copy."}).toObject()) - return; - } - //in case no email sent, the system will get one from first RFID element - if(req.body.email == undefined) { - const copy: Copy.Copy = await queryAsk.getCopyByRFID(req.body.RFID[0]) - req.body.email = copy.Email_Proprietario - } - - const ID_Libreria = await (await queryAsk.getLibreriaByEmail(req.body.email)).ID - if(ID_Libreria == -1) { - res.status(400).send(new proto.BasicMessage({message: "No library associated with passed email."}).toObject()) - return; - } - for(const RFID of req.body.RFID) { - if(!await queryAsk.verifyRFIDExists(RFID)) { - res.status(400).send(new proto.BasicMessage({message: "The RFID passed does not exists."}).toObject()) - return; - } - if(!await queryAsk.addCopyToBackpack(RFID, ID_Libreria)) { - res.status(500).send(new proto.BasicMessage({message: "Something went wrong while adding the copy to backpack."}).toObject()) - return; - } - } - res.status(200).send(new proto.BasicMessage({message: "RFIDs added successfully."}).toObject()) -}); - -router.delete('/removeCopies', async (req: {body: proto.multipleRFID}, res) => { - if(req.body.RFID.length == 0) { - res.status(400).send(new proto.BasicMessage({message: "You need to remove at least 1 copy."}).toObject()) - return; - } - - for(const RFID of req.body.RFID) { - if(!await queryAsk.removeCopyfromBackpack(RFID)) { - res.status(500).send(new proto.BasicMessage({message: "Something went wrong while removing a copy to backpack."}).toObject()) - return; - } - } - res.status(200).send(new proto.BasicMessage({message: "RFIDs removed successfully."}).toObject()) -}); - -router.delete('/clear', async (req: {body: proto.BasicMessage}, res) => { - if(!await queryAsk.removeAllCopyfromBackpackByEmail(req.body.message)) { - res.status(500).send(new proto.BasicMessage({message: "Something went wrong while removing the copies to backpack."}).toObject()) - return; - } - res.status(200).send(new proto.BasicMessage({message: "RFIDs removed successfully."}).toObject()) -}); - -router.get('/getCopiesRFID', async (req: {body: proto.BasicMessage}, res) => { - if(req.body.message == undefined) { - res.status(400).send(new proto.BasicMessage({message: "You need to specify the email."}).toObject()) - return; - } - const resQ = await queryAsk.getBackpackRFIDsByEmail(req.body.message) - if(resQ[0] == "-1") { - res.status(500).send(new proto.BasicMessage({message: "Internal server error."}).toObject()) - return; - } - res.status(200).send(new proto.multipleRFID({RFID: resQ}).toObject()) -}); - -router.get('/getBooksISBN', async (req: {body: proto.BasicMessage}, res) => { - if(req.body.message == undefined) { - res.status(400).send(new proto.BasicMessage({message: "You need to specify the email."}).toObject()) - return; - } - const resQ = await queryAsk.getBackpackISBNByEmail(req.body.message) - if(resQ[0] == "-1") { - res.status(500).send(new proto.BasicMessage({message: "Internal server error."}).toObject()) - return; - } - res.status(200).send(new proto.multipleRFID({RFID: resQ}).toObject()) -}); \ No newline at end of file diff --git a/sources/main/routes/Remove.ts b/sources/main/routes/Remove.ts index 54c7638..84901dd 100644 --- a/sources/main/routes/Remove.ts +++ b/sources/main/routes/Remove.ts @@ -15,7 +15,7 @@ const AccessMicroserviceURL:string = "https://accessmicroservice.azurewebsites.n router.delete('/libreria', async (req: {body: proto.BasicMessage}, res) => { const libreriaFound = await queryAsk.getCopyByEmail(req.body.message) - if(Copy.isAssigned(libreriaFound)) { + if(libreriaFound.length > 0) { res.status(400).send(new proto.BasicMessage({message: "There are some books still assigned to this library. Remove them before."}).toObject()) return; } diff --git a/sources/main/routes/Utility.ts b/sources/main/routes/Utility.ts index 10b935d..5ab5059 100644 --- a/sources/main/routes/Utility.ts +++ b/sources/main/routes/Utility.ts @@ -6,6 +6,7 @@ export default router; import * as protoGen from '../generated/book' import * as Library from '../interfaces/Library'; import * as Book from '../interfaces/Book' +import * as Copy from '../interfaces/Copy' import proto = protoGen.book @@ -19,6 +20,24 @@ router.get('/getBook', async (req, res) => { res.status(200).send(Book.generate_protoBook(await queryAsk.getBookInfo(req.query.ISBN.toString())).toObject()) }); +router.get('/getCopy/RFID', async (req, res) => { + if(req.query.RFID == undefined) { + res.status(400).send(new proto.BasicMessage({message: "Require RFID value."})); + return; + } + res.status(200).send(Copy.generate_protoCopy(await queryAsk.getCopyByRFID(req.query.RFID.toString())).toObject()) +}); + +router.get('/getCopy/Email', async (req, res) => { + if(req.query.email == undefined) { + res.status(400).send(new proto.BasicMessage({message: "Require email value."})); + return; + } + + const resQ: Copy.Copy[] = await queryAsk.getCopyByEmail(req.query.email.toString()) + res.status(200).send(Copy.generate_protoLibrary(resQ).toObject()) +}); + router.post('/changeEmail', async (req: {body: proto.BasicMessage}, res) => { if(await queryAsk.changeEmail(req.body.message, req.body.message2)) { diff --git a/sources/tests/test.test.ts b/sources/tests/test.test.ts index a3b6140..bdc6f05 100644 --- a/sources/tests/test.test.ts +++ b/sources/tests/test.test.ts @@ -185,7 +185,6 @@ describe("remove route functionality", function() { describe("testing utility functionality", function() { const myBook2 = new proto.Book({ISBN: randomISBN(), Titolo: "Test book 2", Autore: "Test Autore", Data_Pubblicazione: new proto.Data({Year: 3845, Month: 12, Day: 5})}) - const myRFID: string[] = ["yesIm_A_ValidRFID123", "yesIm_A_newValidRFID"] describe("recreate data for more testing", function() { it("create 2 books",async () => { await request(app).put('/create/book').send(new proto.BookActions_WithPermission({email_esecutore: "admin", Libro: myBook}).toObject()); @@ -204,12 +203,6 @@ describe("testing utility functionality", function() { }) describe("testing getBook", function() { - it("should get a default book" ,async () => { - const serverResponse = await request(app).get('/utility/getBook').query({ISBN: randomISBN()}) - expect(serverResponse.statusCode).toBe(200) - expect(Book.isAssigned(serverResponse.body)).toBe(false) - }) - it("should get the specified book" ,async () => { const serverResponse = await request(app).get('/utility/getBook').query({ISBN: myBook2.ISBN}) expect(serverResponse.statusCode).toBe(200) @@ -222,61 +215,16 @@ describe("testing utility functionality", function() { expect(serverResponse.body.Data_Pubblicazione.Year).toBe(myBook2.Data_Pubblicazione.Year) }) }) - - describe("testing adding copy to backpack", function() { - it("should give error for no RFID passed",async () => { - const serverResponse = await request(app).put('/backpack/addCopies').send(new proto.multipleRFID({}).toObject()) - expect(serverResponse.statusCode).toBe(400) - expect(serverResponse.body.message).toBe("You need to add at least 1 copy.") - }) - it("should give error for no library associated with email",async () => { - const myRFID: string[] = ["gesù"] - const serverResponse = await request(app).put('/backpack/addCopies').send(new proto.multipleRFID({RFID: myRFID}).toObject()) - expect(serverResponse.statusCode).toBe(400) - expect(serverResponse.body.message).toBe("No library associated with passed email.") - }) - it("should give error for RFID not existing",async () => { - const myRFID: string[] = ["csdceef"] - const serverResponse = await request(app).put('/backpack/addCopies').send(new proto.multipleRFID({email: "admin",RFID: myRFID}).toObject()) - expect(serverResponse.statusCode).toBe(400) - expect(serverResponse.body.message).toBe("The RFID passed does not exists.") - }) - it("should add the RFIDs specified to the backpack",async () => { - - const serverResponse = await request(app).put('/backpack/addCopies').send(new proto.multipleRFID({email: "admin",RFID: myRFID}).toObject()) - expect(serverResponse.statusCode).toBe(200) - expect(serverResponse.body.message).toBe("RFIDs added successfully.") - }) - }) - - describe("testing utility methods of backpack", function() { - it("should get all RFIDs in backpack using email",async () => { - const serverResponse = await request(app).get('/backpack/getCopiesRFID').send(new proto.BasicMessage({message: "admin"}).toObject()) - expect(serverResponse.statusCode).toBe(200) - expect(serverResponse.body.RFID.length).toBe(2) - }) - it("should get all RFIDs in backpack using email",async () => { - const serverResponse = await request(app).get('/backpack/getBooksISBN').send(new proto.BasicMessage({message: "admin"}).toObject()) - expect(serverResponse.statusCode).toBe(200) - expect(serverResponse.body.RFID.length).toBe(2) - }) - }) - - describe("testing remove backpack copies", function() { - it("should give error for no RFID assed",async () => { - const serverResponse = await request(app).delete('/backpack/removeCopies').send(new proto.multipleRFID({}).toObject()) - expect(serverResponse.statusCode).toBe(400) - expect(serverResponse.body.message).toBe("You need to remove at least 1 copy.") - }) - it("should remove the specified RFID",async () => { - const serverResponse = await request(app).delete('/backpack/removeCopies').send(new proto.multipleRFID({RFID: ["yesIm_A_ValidRFID123"]}).toObject()) + + describe("testing getCopiesInfo", function() { + it("should get a copy info with RFID" ,async () => { + const serverResponse = await request(app).get('/utility/getCopy/RFID').query({RFID: "yesIm_A_ValidRFID123"}) expect(serverResponse.statusCode).toBe(200) - expect(serverResponse.body.message).toBe("RFIDs removed successfully.") }) - it("should clear the backpack of a specified user passed by email",async () => { - const serverResponse = await request(app).delete('/backpack/clear').send(new proto.BasicMessage({message: "admin"}).toObject()) + + it("should get all copies info with Email" ,async () => { + const serverResponse = await request(app).get('/utility/getCopy/Email').query({email: "admin"}) expect(serverResponse.statusCode).toBe(200) - expect(serverResponse.body.message).toBe("RFIDs removed successfully.") }) })