Advertisement
mkajt

eracun

Apr 22nd, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.60 KB | None | 0 0
  1. //Priprava knjižnic
  2. var formidable = require("formidable");
  3. var util = require('util');
  4.  
  5. if (!process.env.PORT)
  6. process.env.PORT = 8080;
  7.  
  8. // Priprava povezave na podatkovno bazo
  9. var sqlite3 = require("sqlite3").verbose();
  10. var pb = new sqlite3.Database("Chinook.sl3");
  11.  
  12.  
  13. // Priprava strežnika
  14. var express = require('express');
  15. var expressSession = require('express-session');
  16. var streznik = express();
  17. streznik.set('view engine', 'ejs');
  18. streznik.use(express.static('public'));
  19. streznik.use(
  20. expressSession({
  21. secret: '1234567890QWERTY', // Skrivni ključ za podpisovanje piškotkov
  22. saveUninitialized: true, // Novo sejo shranimo
  23. resave: false, // Ne zahtevamo ponovnega shranjevanja
  24. cookie: {
  25. maxAge: 3600000 // Seja poteče po 60 min neaktivnosti
  26. }
  27. })
  28. );
  29.  
  30. var razmerje_USD_EUR = 0.89;
  31.  
  32. // Izračun davčne stopnje glede na izvajalca in žanr
  33. function davcnaStopnja(izvajalec, zanr) {
  34. switch (izvajalec) {
  35. case "Queen":
  36. case "Led Zepplin":
  37. case "Kiss":
  38. return 0;
  39. case "Justin Bieber":
  40. return 22;
  41. default:
  42. break;
  43. }
  44. switch (zanr) {
  45. case "Metal":
  46. case "Heavy Metal":
  47. case "Easy Listening":
  48. return 0;
  49. default:
  50. return 9.5;
  51. }
  52. }
  53.  
  54. // Vrne naziv stranke (ime ter priimek) glede na ID stranke
  55. function vrniNazivStranke(strankaId, povratniKlic) {
  56. pb.all(
  57. "SELECT Customer.FirstName || ' ' || Customer.LastName AS naziv \
  58. FROM Customer \
  59. WHERE Customer.CustomerId = " + strankaId,
  60. {},
  61. function (napaka, vrstica) {
  62. if (napaka) {
  63. povratniKlic("");
  64. } else {
  65. povratniKlic(vrstica.length > 0 ? vrstica[0].naziv : "");
  66. }
  67. }
  68. );
  69. }
  70.  
  71. // Prikaz seznama pesmi na strani
  72. streznik.get("/", function(zahteva, odgovor) {
  73. pb.all(
  74. "SELECT Track.TrackId AS id, \
  75. Track.Name AS pesem, \
  76. Artist.Name AS izvajalec, \
  77. Track.UnitPrice * " + razmerje_USD_EUR + " AS cena, \
  78. COUNT(InvoiceLine.InvoiceId) AS steviloProdaj, \
  79. Genre.Name AS zanr \
  80. FROM Track, Album, Artist, InvoiceLine, Genre \
  81. WHERE Track.AlbumId = Album.AlbumId AND \
  82. Artist.ArtistId = Album.ArtistId AND \
  83. InvoiceLine.TrackId = Track.TrackId AND \
  84. Track.GenreId = Genre.GenreId \
  85. GROUP BY Track.TrackId \
  86. ORDER BY steviloProdaj DESC, pesem ASC \
  87. LIMIT 100",
  88. function(napaka, vrstice) {
  89. if (napaka) {
  90. odgovor.sendStatus(500);
  91. } else {
  92. for (var i=0; i < vrstice.length; i++) {
  93. vrstice[i].stopnja = davcnaStopnja(
  94. vrstice[i].izvajalec,
  95. vrstice[i].zanr
  96. );
  97. }
  98. vrniNazivStranke(
  99. zahteva.session.trenutnaStranka,
  100. function(nazivOdgovor) {
  101. odgovor.render("seznam", {
  102. seznamPesmi: vrstice,
  103. nazivStranke: nazivOdgovor
  104. });
  105. }
  106. );
  107. }
  108. }
  109. );
  110. });
  111. //Brisanje kosarice
  112. streznik.get("/izbrisikosarico", function(zahteva, odgovor) {
  113. if (zahteva.session.kosarica.length > 0) {
  114. zahteva.session.kosarica = [];
  115. odgovor.send(false);
  116. }else{
  117. odgovor.send(true);
  118. }
  119. });
  120.  
  121. // Dodajanje oz. brisanje pesmi iz košarice
  122. streznik.get("/kosarica/:idPesmi", function(zahteva, odgovor) {
  123. var idPesmi = parseInt(zahteva.params.idPesmi, 10);
  124. if (!zahteva.session.kosarica) {
  125. zahteva.session.kosarica = [];
  126. }
  127. // Če je pesem v košarici, jo izbrišemo
  128. if (zahteva.session.kosarica.indexOf(idPesmi) > -1) {
  129. zahteva.session.kosarica.splice(zahteva.session.kosarica.indexOf(idPesmi), 1);
  130. // Če pesmi ni v košarici, jo dodamo
  131. } else {
  132. zahteva.session.kosarica.push(idPesmi);
  133. }
  134. // V odgovoru vrnemo vsebino celotne košarice
  135. odgovor.send(zahteva.session.kosarica);
  136. });
  137.  
  138. // Vrni podrobnosti pesmi v košarici iz podatkovne baze
  139. var pesmiIzKosarice = function(zahteva, povratniKlic) {
  140. // Če je košarica prazna
  141. if (!zahteva.session.kosarica || zahteva.session.kosarica.length == 0) {
  142. povratniKlic([]);
  143. } else {
  144. pb.all(
  145. "SELECT Track.TrackId AS stevilkaArtikla, \
  146. 1 AS kolicina, \
  147. Track.Name || ' (' || Artist.Name || ')' AS opisArtikla, \
  148. Track.UnitPrice * " + razmerje_USD_EUR + " AS cena, \
  149. Genre.Name AS zanr, \
  150. 0 AS popust \
  151. FROM Track, Album, Artist, Genre \
  152. WHERE Track.AlbumId = Album.AlbumId AND \
  153. Artist.ArtistId = Album.ArtistId AND \
  154. Track.GenreId = Genre.GenreId AND \
  155. Track.TrackId IN (" + zahteva.session.kosarica.join(",") + ")",
  156. function(napaka, vrstice) {
  157. if (napaka) {
  158. povratniKlic(false);
  159. } else {
  160. for (var i=0; i < vrstice.length; i++) {
  161. vrstice[i].stopnja = davcnaStopnja(
  162. (vrstice[i].opisArtikla.split(" (")[1]).split(")")[0],
  163. vrstice[i].zanr
  164. );
  165. }
  166. povratniKlic(vrstice);
  167. }
  168. }
  169. );
  170. }
  171. };
  172.  
  173. // Vrni podrobnosti pesmi v košarici iz trenutne seje vključno s časom izvajanja
  174. streznik.get("/podrobnosti", function(zahteva, odgovor) {
  175. var pesmi = zahteva.session.kosarica ? zahteva.session.kosarica.length : 0;
  176. var cas = casIzvajanjaKosarice(zahteva, function() { return cas; });
  177. });
  178.  
  179. // Vrni čas izvajanja pesmi v košarici iz podatkovne baze
  180. var casIzvajanjaKosarice = function(zahteva, callback) {
  181. if (!zahteva.session.kosarica || zahteva.session.kosarica.length == 0) {
  182. callback(0);
  183. } else {
  184. pb.get(
  185. "SELECT SUM(Milliseconds) / 60000 AS cas \
  186. FROM Track \
  187. WHERE Track.TrackId IN (" + zahteva.session.kosarica.join(",") + ")",
  188. function (napaka, vrstica) {
  189. if (napaka) {
  190. callback(false);
  191. } else {
  192. callback(Math.round(vrstica.cas));
  193. }
  194. }
  195. );
  196. }
  197. };
  198.  
  199. streznik.get("/kosarica", function(zahteva, odgovor) {
  200. pesmiIzKosarice(zahteva, function(pesmi) {
  201. if (!pesmi)
  202. odgovor.sendStatus(500);
  203. else
  204. odgovor.send(pesmi);
  205. });
  206. });
  207.  
  208. // Vrni podrobnosti pesmi na računu
  209. var pesmiIzRacuna = function(racunId, povratniKlic) {
  210. pb.all(
  211. "SELECT Track.TrackId AS stevilkaArtikla, \
  212. 1 AS kolicina, \
  213. Track.Name || ' (' || Artist.Name || ')' AS opisArtikla, \
  214. Track.UnitPrice * " + razmerje_USD_EUR + " AS cena, \
  215. 0 AS popust, \
  216. Genre.Name AS zanr \
  217. FROM Track, Album, Artist, Genre \
  218. WHERE Track.AlbumId = Album.AlbumId AND \
  219. Artist.ArtistId = Album.ArtistId AND \
  220. Track.GenreId = Genre.GenreId AND \
  221. Track.TrackId IN (\
  222. SELECT InvoiceLine.TrackId \
  223. FROM InvoiceLine, Invoice \
  224. WHERE InvoiceLine.InvoiceId = Invoice.InvoiceId AND \
  225. Invoice.InvoiceId = " + racunId +
  226. ")",
  227. function(napaka, vrstice) {
  228. console.log(vrstice);
  229. });
  230. };
  231.  
  232. // Vrni podrobnosti o stranki iz računa
  233. var strankaIzRacuna = function(racunId, callback) {
  234. pb.all(
  235. "SELECT Customer.* \
  236. FROM Customer, Invoice \
  237. WHERE Customer.CustomerId = Invoice.CustomerId AND \
  238. Invoice.InvoiceId = " + racunId,
  239. function(napaka, vrstice) {
  240. console.log(vrstice);
  241. });
  242. };
  243.  
  244. // Izpis računa v HTML predstavitvi na podlagi podatkov iz baze
  245. streznik.post("/izpisiRacunBaza", function(zahteva, odgovor) {
  246. var form = new formidable.IncomingForm();
  247.  
  248. odgovor.end();
  249. });
  250.  
  251. var stranka = function(strankaId, povratniKlic) {
  252. pb.get(
  253. "SELECT Customer.* \
  254. FROM Customer \
  255. WHERE Customer.CustomerId = $cid",
  256. {},
  257. function(napaka, vrstica) {
  258. povratniKlic(false);
  259. });
  260. };
  261.  
  262. // Izpis računa v HTML predstavitvi ali izvorni XML obliki
  263. streznik.get("/izpisiRacun/:oblika", function(zahteva, odgovor) {
  264. pesmiIzKosarice(zahteva, function(pesmi) {
  265. if (!pesmi) {
  266. odgovor.sendStatus(500);
  267. } else if (pesmi.length == 0) {
  268. odgovor.send(
  269. "<p>V košarici nimate nobene pesmi, \
  270. zato računa ni mogoče pripraviti!</p>"
  271. );
  272. } else {
  273. odgovor.setHeader("Content-Type", "text/xml");
  274. odgovor.render(
  275. "eslog",
  276. {
  277. vizualiziraj: zahteva.params.oblika == "html",
  278. postavkeRacuna: pesmi
  279. }
  280. );
  281. }
  282. });
  283. });
  284.  
  285. // Privzeto izpiši račun v HTML obliki
  286. streznik.get("/izpisiRacun", function(zahteva, odgovor) {
  287. odgovor.redirect("/izpisiRacun/html");
  288. });
  289.  
  290. // Vrni stranke iz podatkovne baze
  291. var vrniStranke = function(povratniKlic) {
  292. pb.all("SELECT * FROM Customer",
  293. function (napaka, vrstice) {
  294. povratniKlic(napaka, vrstice);
  295. }
  296. );
  297. };
  298.  
  299. // Vrni račune iz podatkovne baze
  300. var vrniRacune = function(povratniKlic) {
  301. pb.all(
  302. "SELECT Customer.FirstName || ' ' || Customer.LastName || \
  303. ' (' || Invoice.InvoiceId || ') - ' || \
  304. date(Invoice.InvoiceDate) AS Naziv, \
  305. Invoice.InvoiceId, \
  306. Invoice.CustomerId AS idStranke \
  307. FROM Customer, Invoice \
  308. WHERE Customer.CustomerId = Invoice.CustomerId",
  309. function (napaka, vrstice) {
  310. povratniKlic(napaka, vrstice);
  311. }
  312. );
  313. };
  314.  
  315. // Registracija novega uporabnika
  316. streznik.post("/prijava", function(zahteva, odgovor) {
  317. var form = new formidable.IncomingForm();
  318.  
  319. form.parse(zahteva, function (napaka, polja, datoteke) {
  320. pb.run(
  321. "INSERT INTO Customer (FirstName, LastName, Company, \
  322. Address, City, State, Country, PostalCode, \
  323. Phone, Fax, Email, SupportRepId) \
  324. VALUES ($fn, $ln, $com, $addr, $city, $state, $country, $pc, $phone, \
  325. $fax, $email, $sri)",
  326. {},
  327. function(napaka) {
  328. vrniStranke(function(napaka1, stranke) {
  329. vrniRacune(function(napaka2, racuni) {
  330. odgovor.render(
  331. "prijava",
  332. {
  333. sporocilo: "",
  334. seznamStrank: stranke,
  335. seznamRacunov: racuni
  336. }
  337. );
  338. });
  339. });
  340. }
  341. );
  342. });
  343. });
  344.  
  345. function prestejRacuneZaStranko(stranka, racuni) {
  346. var stevec = 0;
  347. for (var i = 0; i < racuni.length; i++) {
  348. if (racuni[i].Naziv.startsWith(stranka.FirstName + " " + stranka.LastName)) {
  349. stevec++;
  350. }
  351. }
  352.  
  353. return stevec;
  354. }
  355.  
  356. // Prikaz strani za prijavo
  357. streznik.get("/prijava", function(zahteva, odgovor) {
  358. vrniStranke(function (napaka1, stranke) {
  359. vrniRacune(function (napaka2, racuni) {
  360. for (var i=0; i < stranke.length; i++) {
  361. stranke[i].StRacunov = prestejRacuneZaStranko(stranke[i], racuni);
  362. }
  363. odgovor.render(
  364. "prijava",
  365. {
  366. sporocilo: "",
  367. seznamStrank: stranke,
  368. seznamRacunov: racuni
  369. }
  370. );
  371. });
  372. });
  373. });
  374.  
  375. // Prikaz nakupovalne košarice za stranko
  376. streznik.post("/stranka", function (zahteva, odgovor) {
  377. var form = new formidable.IncomingForm();
  378. form.parse(zahteva, function (napaka1, polja, datoteke) {
  379. zahteva.session.trenutnaStranka = parseInt(polja["seznamStrank"], 10);
  380. odgovor.redirect("/");
  381. });
  382. });
  383.  
  384. // Odjava stranke
  385. streznik.post("/odjava", function (zahteva, odgovor) {
  386. delete zahteva.session.trenutnaStranka;
  387. delete zahteva.session.kosarica;
  388. odgovor.redirect("/prijava");
  389. });
  390.  
  391. streznik.listen(process.env.PORT, function() {
  392. console.log("Strežnik je pognan!");
  393. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement