From c00d7e5ba038f57bcb6687f9b5ea5c39e914cb6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Tue, 3 May 2022 18:21:36 +0200 Subject: [PATCH 01/27] Dodao registraciju --- .../demo/controller/KupacRestController.java | 37 +++++- .../main/java/vezbe/demo/dto/KupacDto.java | 120 ++++++++++++++++++ .../src/main/java/vezbe/demo/model/Kupac.java | 6 + 3 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 2204e05..10661df 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -1,15 +1,20 @@ package vezbe.demo.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.KupacDto; import vezbe.demo.model.Kupac; +import vezbe.demo.model.Uloga; import vezbe.demo.service.KupacService; +import java.text.ParseException; import java.util.Date; import java.util.List; - +import java.text.SimpleDateFormat; +import java.util.Date; @RestController public class KupacRestController { @@ -22,16 +27,34 @@ public String welcome(){ } @PostMapping("/api/registracija") - public String registracijaKupca(@RequestBody Kupac kupac) { + public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throws ParseException { + + String sDate1=kupacDto.getDatumRodjenja(); + Date date1= null; + + date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + + + Kupac kupac = new Kupac(kupacDto.getKorisnickoIme(), kupacDto.getLozinka(), kupacDto.getIme(), kupacDto.getPrezime(), kupacDto.getPol(), date1); this.kupacService.save(kupac); - return "Uspesna registracija!"; + + return ResponseEntity.ok("Uspesna registracija!"); + } -/* - @GetMapping("/api/employees") + // @PostMapping("/api/registracija") + /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ + + + return ResponseEntity.ok("Successfully logged in!"); + }*/ + + + +/* @GetMapping("/api/kupci") public List getKupci(){ - List employeeList = kupacService.findAll(); + List kupacList = kupacService.findAll(); - return employeeList; + return kupacList; } @GetMapping("/api/employees/{id}") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java new file mode 100644 index 0000000..ed8ef2c --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java @@ -0,0 +1,120 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.*; + +import javax.persistence.*; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static javax.persistence.EnumType.STRING; + +public class KupacDto { + + private Long id; + + private String korisnickoIme; + + private String lozinka; + + private String ime; + + private String prezime; + + private Pol pol; + + private String datumRodjenja; + + private Uloga uloga; + + public KupacDto(Long id, String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, String datumRodjenja) { + this.id = id; + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.pol = pol; + this.datumRodjenja = datumRodjenja; + this.uloga = Uloga.Kupac; + } + public KupacDto(Kupac kupac) { + this.id = kupac.getId(); + this.korisnickoIme = kupac.getKorisnickoIme(); + this.lozinka = kupac.getLozinka(); + this.ime = kupac.getIme(); + this.prezime = kupac.getPrezime(); + this.pol = kupac.getPol(); + this.datumRodjenja = kupac.getDatumRodjenja().toString(); + this.uloga = Uloga.Kupac; + } + + public KupacDto() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getLozinka() { + return lozinka; + } + + public void setLozinka(String lozinka) { + this.lozinka = lozinka; + } + + public String getIme() { + return ime; + } + + public void setIme(String ime) { + this.ime = ime; + } + + public String getPrezime() { + return prezime; + } + + public void setPrezime(String prezime) { + this.prezime = prezime; + } + + public Pol getPol() { + return pol; + } + + public void setPol(Pol pol) { + this.pol = pol; + } + + public String getDatumRodjenja() { + return datumRodjenja; + } + + public void setDatumRodjenja(String datumRodjenja) { + this.datumRodjenja = datumRodjenja; + } + + public Uloga getUloga() { + return uloga; + } + + public void setUloga(Uloga uloga) { + this.uloga = uloga; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index 13ae568..84c10a7 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -23,6 +23,12 @@ public Kupac(String korisnickoIme, String lozinka, String ime, String prezime, P this.tipKupca =tipKupca ; } + public Kupac(String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, Date datumRodjenja){ + super(korisnickoIme, lozinka, ime, prezime, pol,datumRodjenja, Uloga.Kupac); + this.bodovi = 0; + this.tipKupca = null; + } + public Kupac() { } From 76e299422983d77b62ccb984ee72b9fb0405f47e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sat, 7 May 2022 11:06:51 +0200 Subject: [PATCH 02/27] Kreiranje Menadzera i Dostavljaca Treba dodati sesiju i ispitivanje da li je na sesiji Admin, ako nije onda vratiti neki bad request ili sl. --- .../controller/DostavljacRestController.java | 75 ++++++++++++ .../demo/controller/KupacRestController.java | 8 +- .../controller/MenadzerRestController.java | 72 +++++++++++ .../java/vezbe/demo/dto/DostavljacDto.java | 114 ++++++++++++++++++ .../main/java/vezbe/demo/dto/KupacDto.java | 18 +-- .../main/java/vezbe/demo/dto/MenadzerDto.java | 114 ++++++++++++++++++ .../java/vezbe/demo/model/Dostavljac.java | 4 + .../main/java/vezbe/demo/model/Menadzer.java | 4 + .../vezbe/demo/service/DostavljacService.java | 37 ++++++ .../vezbe/demo/service/MenadzerService.java | 35 ++++++ 10 files changed, 466 insertions(+), 15 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/DostavljacDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/MenadzerDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java new file mode 100644 index 0000000..b23ad80 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java @@ -0,0 +1,75 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.DostavljacDto; +import vezbe.demo.dto.MenadzerDto; +import vezbe.demo.model.Dostavljac; +import vezbe.demo.model.Menadzer; +import vezbe.demo.model.Pol; +import vezbe.demo.service.DostavljacService; +import vezbe.demo.service.MenadzerService; +import javax.servlet.http.HttpSession; +import java.text.ParseException; +import java.util.Date; +import java.text.SimpleDateFormat; + +@RestController +public class DostavljacRestController { + + @Autowired + private DostavljacService dostavljacService; + + + //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST + @PostMapping("/api/kreirajDostavljaca") + public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto) throws ParseException { + + String sDate1=dostavljacDto.getDatumRodjenja(); + Date date1= null; + date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + + Pol pol = Pol.valueOf(dostavljacDto.getPol()); + + Dostavljac dostavljac = new Dostavljac(dostavljacDto.getKorisnickoIme(), dostavljacDto.getLozinka(), dostavljacDto.getIme(), dostavljacDto.getPrezime(),pol, date1); + this.dostavljacService.save(dostavljac); + + return ResponseEntity.ok("Uspesno kreiranje dostavljaca!"); + + } + // @PostMapping("/api/registracija") + /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ + + + return ResponseEntity.ok("Successfully logged in!"); + }*/ + + + +/* @GetMapping("/api/kupci") + public List getKupci(){ + List kupacList = kupacService.findAll(); + + return kupacList; + } + + @GetMapping("/api/employees/{id}") + public Kupac getEmployee(@PathVariable(name = "id") Long id){ + Kupac employee = employeeService.findOne(id); + return employee; + } + + @PostMapping("/api/save-employee") + public String saveEmployee(@RequestBody Employee employee) { + this.employeeService.save(employee); + return "Successfully saved an employee!"; + } + @GetMapping("/api/delById/{id}") + public String deleteEmployee(@PathVariable(name = "id") Long id){ + Employee employee = employeeService.findOne(id); + this.employeeService.delete(employee); + return "Sucessfully deleted and employee!"; + } +*/ +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 10661df..847d26d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.KupacDto; import vezbe.demo.model.Kupac; +import vezbe.demo.model.Pol; import vezbe.demo.model.Uloga; import vezbe.demo.service.KupacService; @@ -26,16 +27,17 @@ public String welcome(){ return "Hello from api!"; } + //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST @PostMapping("/api/registracija") public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throws ParseException { String sDate1=kupacDto.getDatumRodjenja(); Date date1= null; + date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); - date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + Pol pol = Pol.valueOf(kupacDto.getPol()); - - Kupac kupac = new Kupac(kupacDto.getKorisnickoIme(), kupacDto.getLozinka(), kupacDto.getIme(), kupacDto.getPrezime(), kupacDto.getPol(), date1); + Kupac kupac = new Kupac(kupacDto.getKorisnickoIme(), kupacDto.getLozinka(), kupacDto.getIme(), kupacDto.getPrezime(),pol, date1); this.kupacService.save(kupac); return ResponseEntity.ok("Uspesna registracija!"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java new file mode 100644 index 0000000..eed723d --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -0,0 +1,72 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.MenadzerDto; +import vezbe.demo.model.Menadzer; +import vezbe.demo.model.Pol; +import vezbe.demo.service.MenadzerService; +import javax.servlet.http.HttpSession; +import java.text.ParseException; +import java.util.Date; +import java.text.SimpleDateFormat; + +@RestController +public class MenadzerRestController { + + @Autowired + private MenadzerService menadzerService; + + + + @PostMapping("/api/kreirajMenadzera") + public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzerDto) throws ParseException { + + String sDate1=menadzerDto.getDatumRodjenja(); + Date date1= null; + date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + + Pol pol = Pol.valueOf(menadzerDto.getPol()); + + Menadzer menadzer = new Menadzer(menadzerDto.getKorisnickoIme(), menadzerDto.getLozinka(), menadzerDto.getIme(), menadzerDto.getPrezime(),pol, date1); + this.menadzerService.save(menadzer); + + return ResponseEntity.ok("Uspesno kreiranje menadzera!"); + + } + // @PostMapping("/api/registracija") + /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ + + + return ResponseEntity.ok("Successfully logged in!"); + }*/ + + + +/* @GetMapping("/api/kupci") + public List getKupci(){ + List kupacList = kupacService.findAll(); + + return kupacList; + } + + @GetMapping("/api/employees/{id}") + public Kupac getEmployee(@PathVariable(name = "id") Long id){ + Kupac employee = employeeService.findOne(id); + return employee; + } + + @PostMapping("/api/save-employee") + public String saveEmployee(@RequestBody Employee employee) { + this.employeeService.save(employee); + return "Successfully saved an employee!"; + } + @GetMapping("/api/delById/{id}") + public String deleteEmployee(@PathVariable(name = "id") Long id){ + Employee employee = employeeService.findOne(id); + this.employeeService.delete(employee); + return "Sucessfully deleted and employee!"; + } +*/ +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/DostavljacDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/DostavljacDto.java new file mode 100644 index 0000000..4cf665e --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/DostavljacDto.java @@ -0,0 +1,114 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.*; + +import javax.persistence.*; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static javax.persistence.EnumType.STRING; + +public class DostavljacDto { + + private Long id; + + private String korisnickoIme; + + private String lozinka; + + private String ime; + + private String prezime; + + private String pol; + + private String datumRodjenja; + + private Uloga uloga; + + public DostavljacDto(Long id, String korisnickoIme, String lozinka, String ime, String prezime, String pol, String datumRodjenja) { + + this.uloga = Uloga.Kupac; + } + public DostavljacDto(Kupac kupac) { + this.id = kupac.getId(); + this.korisnickoIme = kupac.getKorisnickoIme(); + this.lozinka = kupac.getLozinka(); + this.ime = kupac.getIme(); + this.prezime = kupac.getPrezime(); + this.pol = kupac.getPol().name(); + this.datumRodjenja = kupac.getDatumRodjenja().toString(); + this.uloga = Uloga.Kupac; + } + + public DostavljacDto() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getLozinka() { + return lozinka; + } + + public void setLozinka(String lozinka) { + this.lozinka = lozinka; + } + + public String getIme() { + return ime; + } + + public void setIme(String ime) { + this.ime = ime; + } + + public String getPrezime() { + return prezime; + } + + public void setPrezime(String prezime) { + this.prezime = prezime; + } + + public String getPol() { + return pol; + } + + public void setPol(String pol) { + this.pol = pol; + } + + public String getDatumRodjenja() { + return datumRodjenja; + } + + public void setDatumRodjenja(String datumRodjenja) { + this.datumRodjenja = datumRodjenja; + } + + public Uloga getUloga() { + return uloga; + } + + public void setUloga(Uloga uloga) { + this.uloga = uloga; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java index ed8ef2c..d324f31 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KupacDto.java @@ -24,20 +24,14 @@ public class KupacDto { private String prezime; - private Pol pol; + private String pol; private String datumRodjenja; private Uloga uloga; - public KupacDto(Long id, String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, String datumRodjenja) { - this.id = id; - this.korisnickoIme = korisnickoIme; - this.lozinka = lozinka; - this.ime = ime; - this.prezime = prezime; - this.pol = pol; - this.datumRodjenja = datumRodjenja; + public KupacDto(Long id, String korisnickoIme, String lozinka, String ime, String prezime, String pol, String datumRodjenja) { + this.uloga = Uloga.Kupac; } public KupacDto(Kupac kupac) { @@ -46,7 +40,7 @@ public KupacDto(Kupac kupac) { this.lozinka = kupac.getLozinka(); this.ime = kupac.getIme(); this.prezime = kupac.getPrezime(); - this.pol = kupac.getPol(); + this.pol = kupac.getPol().name(); this.datumRodjenja = kupac.getDatumRodjenja().toString(); this.uloga = Uloga.Kupac; } @@ -94,11 +88,11 @@ public void setPrezime(String prezime) { this.prezime = prezime; } - public Pol getPol() { + public String getPol() { return pol; } - public void setPol(Pol pol) { + public void setPol(String pol) { this.pol = pol; } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/MenadzerDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/MenadzerDto.java new file mode 100644 index 0000000..c0b1970 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/MenadzerDto.java @@ -0,0 +1,114 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.*; + +import javax.persistence.*; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static javax.persistence.EnumType.STRING; + +public class MenadzerDto { + + private Long id; + + private String korisnickoIme; + + private String lozinka; + + private String ime; + + private String prezime; + + private String pol; + + private String datumRodjenja; + + private Uloga uloga; + + public MenadzerDto(Long id, String korisnickoIme, String lozinka, String ime, String prezime, String pol, String datumRodjenja) { + + this.uloga = Uloga.Kupac; + } + public MenadzerDto(Kupac kupac) { + this.id = kupac.getId(); + this.korisnickoIme = kupac.getKorisnickoIme(); + this.lozinka = kupac.getLozinka(); + this.ime = kupac.getIme(); + this.prezime = kupac.getPrezime(); + this.pol = kupac.getPol().name(); + this.datumRodjenja = kupac.getDatumRodjenja().toString(); + this.uloga = Uloga.Kupac; + } + + public MenadzerDto() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getLozinka() { + return lozinka; + } + + public void setLozinka(String lozinka) { + this.lozinka = lozinka; + } + + public String getIme() { + return ime; + } + + public void setIme(String ime) { + this.ime = ime; + } + + public String getPrezime() { + return prezime; + } + + public void setPrezime(String prezime) { + this.prezime = prezime; + } + + public String getPol() { + return pol; + } + + public void setPol(String pol) { + this.pol = pol; + } + + public String getDatumRodjenja() { + return datumRodjenja; + } + + public void setDatumRodjenja(String datumRodjenja) { + this.datumRodjenja = datumRodjenja; + } + + public Uloga getUloga() { + return uloga; + } + + public void setUloga(Uloga uloga) { + this.uloga = uloga; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java index b7362e3..5ad857e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java @@ -16,6 +16,10 @@ public Dostavljac(String korisnickoIme, String lozinka, String ime, String prezi super(korisnickoIme, lozinka, ime, prezime, pol, datumRodjenja, Uloga.Dostavljac); this.porudzbineZaDostavu = porudzbineZaDostavu; } + public Dostavljac(String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, Date datumRodjenja) { + super(korisnickoIme, lozinka, ime, prezime, pol, datumRodjenja, Uloga.Dostavljac); + this.porudzbineZaDostavu = new HashSet<>(); + } public Dostavljac() { super(); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Menadzer.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Menadzer.java index d777e61..f5aadc6 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Menadzer.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Menadzer.java @@ -14,6 +14,10 @@ public Menadzer(String korisnickoIme, String lozinka, String ime, String prezime super(korisnickoIme, lozinka, ime, prezime, pol, datumRodjenja, Uloga.Menadzer); this.restoran = restoran; } + public Menadzer(String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, Date datumRodjenja) { + super(korisnickoIme, lozinka, ime, prezime, pol, datumRodjenja, Uloga.Menadzer); + this.restoran = null; + } public Menadzer() { } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java new file mode 100644 index 0000000..b22e7af --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java @@ -0,0 +1,37 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Dostavljac; +import vezbe.demo.model.Kupac; +import vezbe.demo.model.Menadzer; +import vezbe.demo.repository.DostavljacRepository; +import vezbe.demo.repository.MenadzerRepository; + +import java.util.List; +import java.util.Optional; + +@Service +public class DostavljacService { + + @Autowired + private DostavljacRepository dostavljacRepository; + + public Dostavljac findOne(Long id){ + Optional foundDostavljac = dostavljacRepository.findById(id); + if (foundDostavljac.isPresent()) + return foundDostavljac.get(); + + return null; + } + + public List findAll(){ + return dostavljacRepository.findAll(); + } + + public Dostavljac save(Dostavljac dostavljac){ + return dostavljacRepository.save(dostavljac); + } + + public void delete(Dostavljac dostavljac){dostavljacRepository.delete(dostavljac);} +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java new file mode 100644 index 0000000..722b2ad --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java @@ -0,0 +1,35 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Kupac; +import vezbe.demo.model.Menadzer; +import vezbe.demo.repository.MenadzerRepository; + +import java.util.List; +import java.util.Optional; + +@Service +public class MenadzerService { + + @Autowired + private MenadzerRepository menadzerRepository; + + public Menadzer findOne(Long id){ + Optional foundMenadzer = menadzerRepository.findById(id); + if (foundMenadzer.isPresent()) + return foundMenadzer.get(); + + return null; + } + + public List findAll(){ + return menadzerRepository.findAll(); + } + + public Menadzer save(Menadzer menadzer){ + return menadzerRepository.save(menadzer); + } + + public void delete(Menadzer menadzer){menadzerRepository.delete(menadzer);} +} From 9057eea9fe685217a6c6d6f523c6dfe2c678d65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sat, 7 May 2022 14:56:43 +0200 Subject: [PATCH 03/27] Prijavlijvanje na sistem i pregled svog profila Dodao sam prijavlljvanje na sistem i mogucnost pregleda svojih podataka. Nisam dodao mogucnost menjanja svojih podataka. --- .../main/java/vezbe/demo/DemoApplication.java | 1 + .../controller/KorisnikRestController.java | 49 +++++++++++++++++++ .../demo/controller/KupacRestController.java | 11 ++--- .../main/java/vezbe/demo/dto/KorisnikDto.java | 4 ++ .../main/java/vezbe/demo/dto/LoginDto.java | 44 +++++++++++++++++ .../java/vezbe/demo/model/Dostavljac.java | 2 +- .../main/java/vezbe/demo/model/Korisnik.java | 4 +- .../src/main/java/vezbe/demo/model/Kupac.java | 2 +- .../vezbe/demo/service/KorisnikService.java | 48 ++++++++++++++++++ .../src/main/resources/application.properties | 3 +- 10 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/DemoApplication.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/DemoApplication.java index 8e8eefb..19c3e96 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/DemoApplication.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/DemoApplication.java @@ -3,6 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; + @SpringBootApplication public class DemoApplication { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java new file mode 100644 index 0000000..63cc0cb --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -0,0 +1,49 @@ +package vezbe.demo.controller; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.LoginDto; +import vezbe.demo.model.*; +import vezbe.demo.service.KorisnikService; + +import javax.servlet.http.HttpSession; +import java.util.ArrayList; +import java.util.List; + +@RestController +public class KorisnikRestController { + @Autowired + private KorisnikService korisnikService; + + @PostMapping("/api/login") + public ResponseEntity login(@RequestBody LoginDto loginDto, HttpSession session){ + if(loginDto.getKorisnickoIme().isEmpty() || loginDto.getLozinka().isEmpty()){ + return new ResponseEntity("Invalid login data", HttpStatus.BAD_REQUEST); + } + Korisnik loggedKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); + if (loggedKorisnik == null) + return new ResponseEntity<>("Korisnik ne postoji!", HttpStatus.NOT_FOUND); + Korisnik prijavljeniKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); + session.setAttribute("logovaniKorsinik", loggedKorisnik); + + + return ResponseEntity.ok("Uspesno prijavljivanje!"); + } + + @GetMapping("/api/profil") + public ResponseEntity getProfil(HttpSession session){ + + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + + if(loggedKorisnik == null) { + System.out.println("Nema sesije"); + } else { + System.out.println(loggedKorisnik); + } + return ResponseEntity.ok(loggedKorisnik); + + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 847d26d..f3b498e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -1,16 +1,17 @@ package vezbe.demo.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.KupacDto; -import vezbe.demo.model.Kupac; -import vezbe.demo.model.Pol; -import vezbe.demo.model.Uloga; +import vezbe.demo.dto.LoginDto; +import vezbe.demo.model.*; import vezbe.demo.service.KupacService; +import javax.servlet.http.HttpSession; import java.text.ParseException; import java.util.Date; import java.util.List; @@ -43,12 +44,8 @@ public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throw return ResponseEntity.ok("Uspesna registracija!"); } - // @PostMapping("/api/registracija") - /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ - return ResponseEntity.ok("Successfully logged in!"); - }*/ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java new file mode 100644 index 0000000..c54b96e --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java @@ -0,0 +1,4 @@ +package vezbe.demo.dto; + +public class KorisnikDto { +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java new file mode 100644 index 0000000..2cc2689 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java @@ -0,0 +1,44 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.*; + +import javax.persistence.*; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static javax.persistence.EnumType.STRING; + +public class LoginDto { + + private String korisnickoIme; + + private String lozinka; + + public LoginDto() { + } + + public LoginDto(String korisnickoIme, String lozinka) { + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getLozinka() { + return lozinka; + } + + public void setLozinka(String lozinka) { + this.lozinka = lozinka; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java index 5ad857e..32517ba 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java @@ -8,7 +8,7 @@ @Entity public class Dostavljac extends Korisnik implements Serializable { - @OneToMany + @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name ="dostavljac_id") private Set porudzbineZaDostavu= new HashSet<>(); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java index a3f2ae6..36dae63 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java @@ -8,7 +8,7 @@ @Entity @Inheritance(strategy = InheritanceType.JOINED) -public abstract class Korisnik implements Serializable { +public class Korisnik implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -44,6 +44,7 @@ public Korisnik(String korisnickoIme, String lozinka, String ime, String prezime public Korisnik() { } + public String getKorisnickoIme() { return korisnickoIme; } @@ -107,4 +108,5 @@ public Uloga getUloga() { public void setUloga(Uloga uloga) { this.uloga = uloga; } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index 84c10a7..ab6bda6 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -9,7 +9,7 @@ @Entity public class Kupac extends Korisnik implements Serializable { @Column(name = "porudzbina_id") - @OneToMany(cascade = CascadeType.ALL, mappedBy="kupac") + @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy="kupac") private Set listaPorudzbina = new HashSet<>(); private int bodovi; @OneToOne diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java new file mode 100644 index 0000000..32bc37e --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java @@ -0,0 +1,48 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.*; +import vezbe.demo.repository.KorisnikRepository; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class KorisnikService { + + @Autowired + private KorisnikRepository korisnikRepository; + + public Korisnik login(String username, String password){ + List listaKorisnika = new ArrayList<>(); + Korisnik korisnik = new Korisnik(); + Menadzer mena = new Menadzer(); + + listaKorisnika = korisnikRepository.findAll(); + for(Korisnik k:listaKorisnika){ + if(k.getKorisnickoIme().equals(username) && k.getLozinka().equals(password)){ + korisnik = k; + } + } + Kupac k; + Dostavljac d; + Menadzer m; + if(korisnik.getUloga().equals(Uloga.Menadzer)){ + m = (Menadzer) korisnik; + return m; + } + if(korisnik.getUloga().equals(Uloga.Kupac)){ + k = (Kupac) korisnik; + return k; + } + if(korisnik.getUloga().equals(Uloga.Dostavljac)){ + d = (Dostavljac) korisnik; + return d; + } + return korisnik; + + } + + +} diff --git a/Nadogradnja-demoa/src/main/resources/application.properties b/Nadogradnja-demoa/src/main/resources/application.properties index 0e4848a..2213761 100644 --- a/Nadogradnja-demoa/src/main/resources/application.properties +++ b/Nadogradnja-demoa/src/main/resources/application.properties @@ -17,4 +17,5 @@ spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy -spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false \ No newline at end of file +spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false + From 6d6bc20ad33b8162d29821b26c694fc7b154f81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sat, 7 May 2022 16:50:18 +0200 Subject: [PATCH 04/27] Admin i Menadzer pregled svojih podataka MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dodao sam da Administratori imaju pregled svih korisnika. Dodao sam da Menadžer ima pregled svog restorana i porudžbina koje su vezane za taj restoran --- .../configuration/DatabaseConfiguration.java | 3 ++ .../controller/KorisnikRestController.java | 15 +++++++- .../controller/MenadzerRestController.java | 30 ++++++++++++--- .../controller/PorudzbinaRestController.java | 38 +++++++++++++++++++ .../java/vezbe/demo/model/Dostavljac.java | 3 ++ .../main/java/vezbe/demo/model/Korisnik.java | 8 +++- .../src/main/java/vezbe/demo/model/Kupac.java | 3 ++ .../java/vezbe/demo/model/Porudzbina.java | 2 + .../main/java/vezbe/demo/model/Restoran.java | 2 +- .../vezbe/demo/service/KorisnikService.java | 33 ++++++---------- .../vezbe/demo/service/MenadzerService.java | 19 +++++++++- .../vezbe/demo/service/PorudzbinaService.java | 35 +++++++++++++++++ 12 files changed, 158 insertions(+), 33 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index 36431ea..5731f6b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -226,6 +226,9 @@ public boolean instantiate(){ komentarRepository.save(komentar); Komentar komentar2 = new Komentar(kupac, restoran2, "Me likey, very nice", 5); komentarRepository.save(komentar2); + + Korisnik admin = new Korisnik("admin", "sifra", "Admin", "Adminovski" , Pol.muski,new Date(101, Calendar.SEPTEMBER, 10), Uloga.Admin); + korisnikRepository.save(admin); /*Department department1 = new Department("first department"); Department department2 = new Department("second department"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index 63cc0cb..0a87d0f 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -26,9 +26,11 @@ public ResponseEntity login(@RequestBody LoginDto loginDto, HttpSession Korisnik loggedKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); if (loggedKorisnik == null) return new ResponseEntity<>("Korisnik ne postoji!", HttpStatus.NOT_FOUND); - Korisnik prijavljeniKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); + session.setAttribute("logovaniKorsinik", loggedKorisnik); + Korisnik prijavljeniKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); + return ResponseEntity.ok("Uspesno prijavljivanje!"); } @@ -46,4 +48,15 @@ public ResponseEntity getProfil(HttpSession session){ return ResponseEntity.ok(loggedKorisnik); } + @GetMapping("/api/korisnici") + public ResponseEntity> getSveKorisnike(HttpSession session){ + List listaKorisnika = new ArrayList<>(); + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if(loggedKorisnik.getUloga()!=Uloga.Admin){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + listaKorisnika = korisnikService.findAll(); + return ResponseEntity.ok(listaKorisnika); + + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java index eed723d..0c84379 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -1,16 +1,18 @@ package vezbe.demo.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.MenadzerDto; -import vezbe.demo.model.Menadzer; -import vezbe.demo.model.Pol; +import vezbe.demo.model.*; import vezbe.demo.service.MenadzerService; import javax.servlet.http.HttpSession; import java.text.ParseException; +import java.util.ArrayList; import java.util.Date; import java.text.SimpleDateFormat; +import java.util.List; @RestController public class MenadzerRestController { @@ -35,13 +37,29 @@ public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzer return ResponseEntity.ok("Uspesno kreiranje menadzera!"); } - // @PostMapping("/api/registracija") - /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ + @GetMapping("/api/pregledRestorana") + public ResponseEntity getRestoran(HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + Restoran restoran = menadzerService.findRestoran(loggedKorisnik.getId()); + return ResponseEntity.ok(restoran); + + } +/* @GetMapping("/api/pregledPorudzbina") + public ResponseEntity> getPorudzbine(HttpSession session){ + List listaPorudzbina = new ArrayList<>(); + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + Restoran restoran = menadzerService.findRestoran(loggedKorisnik.getId()); - return ResponseEntity.ok("Successfully logged in!"); - }*/ + } +*/ /* @GetMapping("/api/kupci") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java new file mode 100644 index 0000000..7deb52c --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -0,0 +1,38 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import vezbe.demo.model.*; +import vezbe.demo.service.MenadzerService; +import vezbe.demo.service.PorudzbinaService; + +import javax.servlet.http.HttpSession; +import java.util.ArrayList; +import java.util.List; + +@RestController +public class PorudzbinaRestController { + + @Autowired + private PorudzbinaService porudzbinaService; + + + @GetMapping("/api/pregledPorudzbina") + public ResponseEntity> getPorudzbine(HttpSession session) { + List listaPorudzbina = new ArrayList<>(); + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik.getUloga() != Uloga.Menadzer) { + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + + Restoran r = ((Menadzer) loggedKorisnik).getRestoran(); + listaPorudzbina = porudzbinaService.getListaPorudzbina(r); + + return ResponseEntity.ok(listaPorudzbina); + + + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java index 32517ba..7c235d7 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Dostavljac.java @@ -1,5 +1,7 @@ package vezbe.demo.model; +import com.fasterxml.jackson.annotation.JsonIgnore; + import javax.persistence.*; import java.io.Serializable; import java.util.HashSet; @@ -10,6 +12,7 @@ public class Dostavljac extends Korisnik implements Serializable { @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name ="dostavljac_id") + @JsonIgnore private Set porudzbineZaDostavu= new HashSet<>(); public Dostavljac(String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, Date datumRodjenja, Set porudzbineZaDostavu) { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java index 36dae63..841907d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Korisnik.java @@ -43,7 +43,13 @@ public Korisnik(String korisnickoIme, String lozinka, String ime, String prezime public Korisnik() { } - + public Korisnik(String username, String password, String ime, String prezime) { + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.uloga = Uloga.Admin; + } public String getKorisnickoIme() { return korisnickoIme; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index ab6bda6..2252bd1 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -1,5 +1,7 @@ package vezbe.demo.model; +import com.fasterxml.jackson.annotation.JsonIgnore; + import javax.persistence.*; import java.io.Serializable; import java.util.HashSet; @@ -10,6 +12,7 @@ public class Kupac extends Korisnik implements Serializable { @Column(name = "porudzbina_id") @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy="kupac") + @JsonIgnore private Set listaPorudzbina = new HashSet<>(); private int bodovi; @OneToOne diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java index 67579e6..d1ffe8b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java @@ -1,5 +1,6 @@ package vezbe.demo.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @@ -24,6 +25,7 @@ public class Porudzbina implements Serializable { @JoinColumn(name = "porudzbina_id") private Set poruceniArtikli = new HashSet<>(); @ManyToOne + @JsonIgnore private Restoran restoran; @Column(name = "datum_i_vreme") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java index c51e5bb..078dd39 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java @@ -17,7 +17,7 @@ public class Restoran implements Serializable { @Column(nullable = false) private String tipRestorana; - @OneToMany + @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "restoran_id") private Set ponuda = new HashSet<>(); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java index 32bc37e..f5be5e1 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java @@ -14,35 +14,24 @@ public class KorisnikService { @Autowired private KorisnikRepository korisnikRepository; - public Korisnik login(String username, String password){ + public Korisnik login(String username, String password) { List listaKorisnika = new ArrayList<>(); - Korisnik korisnik = new Korisnik(); - Menadzer mena = new Menadzer(); + listaKorisnika = korisnikRepository.findAll(); - for(Korisnik k:listaKorisnika){ - if(k.getKorisnickoIme().equals(username) && k.getLozinka().equals(password)){ - korisnik = k; - } - } - Kupac k; - Dostavljac d; - Menadzer m; - if(korisnik.getUloga().equals(Uloga.Menadzer)){ - m = (Menadzer) korisnik; - return m; - } - if(korisnik.getUloga().equals(Uloga.Kupac)){ - k = (Kupac) korisnik; - return k; - } - if(korisnik.getUloga().equals(Uloga.Dostavljac)){ - d = (Dostavljac) korisnik; - return d; + Korisnik korisnik = null; + for (Korisnik k : listaKorisnika) { + if (k.getKorisnickoIme().equals(username) && k.getLozinka().equals(password)) { + korisnik = k; + } } + return korisnik; } + public List findAll(){ + return korisnikRepository.findAll(); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java index 722b2ad..0156354 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java @@ -2,8 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import vezbe.demo.model.Kupac; -import vezbe.demo.model.Menadzer; +import vezbe.demo.model.*; import vezbe.demo.repository.MenadzerRepository; import java.util.List; @@ -32,4 +31,20 @@ public Menadzer save(Menadzer menadzer){ } public void delete(Menadzer menadzer){menadzerRepository.delete(menadzer);} + + public Restoran findRestoran(Long ID){ + for(Menadzer menadzer: menadzerRepository.findAll()){ + if(menadzer.getId().equals(ID)){ + return menadzer.getRestoran(); + + } + } + return null; + } + /* public List findPorudzbine(Long ID){ + Restoran r = findRestoran(ID); + for(Artikal artikal: r.getPonuda()){ + for() + } + }*/ } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java new file mode 100644 index 0000000..fd67403 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -0,0 +1,35 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Artikal; +import vezbe.demo.model.Porudzbina; +import vezbe.demo.model.Restoran; +import vezbe.demo.model.StavkaPorudzbine; +import vezbe.demo.repository.PorudzbinaRepository; +import vezbe.demo.repository.StavkaPorudzbineRepository; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class PorudzbinaService { + @Autowired + PorudzbinaRepository porudzbinaRepository; + + public List getListaPorudzbina(Restoran restoran){ + List listaPorudzbina = new ArrayList<>(); + for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ + for(StavkaPorudzbine stavkaPorudzbine: porudzbina.getPoruceniArtikli()){ + for(Artikal artikal: restoran.getPonuda()){ + if(stavkaPorudzbine.getPoruceniArtikal().getId().equals(artikal.getId())) { + listaPorudzbina.add(porudzbina); + break; + } + + } + } + } + return listaPorudzbina; + } +} From 74538230a96bd7f320ba7c3f02cc06d2de51132a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Wed, 11 May 2022 15:30:37 +0200 Subject: [PATCH 05/27] Restoran Dodali smo sledece funkcionalnosti: Mogucnosti admina: -kreiranje Dostavljaca i Menadzera -Postavljanje menadzera restorana - Kreiranje Restorana -Prikaz svih restorana u okviru pocetne strane -Dobavljanje restorana preko tipa, naziva ili lokacije restorana Mogucnosti menadzera: -Dodavanje artikala i brisanje artikala iz ponude restorana Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/ArtikalRestController.java | 23 +++++ .../controller/DostavljacRestController.java | 17 ++-- .../demo/controller/KupacRestController.java | 6 +- .../controller/LokacijaRestController.java | 40 ++++++++ .../controller/MenadzerRestController.java | 52 ++++------ .../controller/RestoranRestController.java | 99 +++++++++++++++++++ .../main/java/vezbe/demo/dto/ArtikalDto.java | 76 ++++++++++++++ .../main/java/vezbe/demo/dto/LokacijaDto.java | 43 ++++++++ .../java/vezbe/demo/dto/NoviMenadzerDto.java | 30 ++++++ .../main/java/vezbe/demo/dto/RestoranDto.java | 31 ++++++ .../main/java/vezbe/demo/model/Artikal.java | 6 ++ .../main/java/vezbe/demo/model/Lokacija.java | 2 +- .../main/java/vezbe/demo/model/Restoran.java | 5 + .../demo/repository/MenadzerRepository.java | 1 + .../vezbe/demo/service/ArtikalService.java | 30 ++++++ .../vezbe/demo/service/LokacijaService.java | 16 +++ .../vezbe/demo/service/MenadzerService.java | 32 +++++- .../vezbe/demo/service/RestoranService.java | 77 +++++++++++++++ 18 files changed, 537 insertions(+), 49 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/ArtikalRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/NoviMenadzerDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/LokacijaService.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/ArtikalRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/ArtikalRestController.java new file mode 100644 index 0000000..9f88ad4 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/ArtikalRestController.java @@ -0,0 +1,23 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.ArtikalDto; +import vezbe.demo.model.*; +import vezbe.demo.service.ArtikalService; + +import javax.servlet.http.HttpSession; +import java.util.List; +import java.util.Set; + +@RestController +public class ArtikalRestController { + + @Autowired + private ArtikalService artikalService; + + + +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java index b23ad80..c993f7b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java @@ -1,13 +1,12 @@ package vezbe.demo.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.DostavljacDto; import vezbe.demo.dto.MenadzerDto; -import vezbe.demo.model.Dostavljac; -import vezbe.demo.model.Menadzer; -import vezbe.demo.model.Pol; +import vezbe.demo.model.*; import vezbe.demo.service.DostavljacService; import vezbe.demo.service.MenadzerService; import javax.servlet.http.HttpSession; @@ -22,10 +21,16 @@ public class DostavljacRestController { private DostavljacService dostavljacService; - //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST + //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST, TO SAM DODAO SAD @PostMapping("/api/kreirajDostavljaca") - public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto) throws ParseException { - + public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto, HttpSession session) throws ParseException { + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Admin){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } String sDate1=dostavljacDto.getDatumRodjenja(); Date date1= null; date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index f3b498e..2a77c84 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -23,12 +23,8 @@ public class KupacRestController { @Autowired private KupacService kupacService; - @GetMapping("/api/") - public String welcome(){ - return "Hello from api!"; - } - //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST + @PostMapping("/api/registracija") public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throws ParseException { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java new file mode 100644 index 0000000..9018fd9 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java @@ -0,0 +1,40 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vezbe.demo.dto.LokacijaDto; +import vezbe.demo.dto.RestoranDto; +import vezbe.demo.model.Korisnik; +import vezbe.demo.model.Lokacija; +import vezbe.demo.model.Restoran; +import vezbe.demo.model.Uloga; +import vezbe.demo.service.LokacijaService; + +import javax.servlet.http.HttpSession; + +@RestController +public class LokacijaRestController { + @Autowired + private LokacijaService lokacijaService; + + @PostMapping("/api/kreirajLokaciju") + public ResponseEntity kreirajLokaciju(@RequestBody LokacijaDto lokacijaDto, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Admin){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + + Lokacija lokacija = new Lokacija(lokacijaDto.getGeoDuzina(), lokacijaDto.getGeoSirina(), lokacijaDto.getAdresa()); + this.lokacijaService.save(lokacija); + + return ResponseEntity.ok("Uspesno kreiranje lokacije!"); + } + +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java index 0c84379..418a91e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -23,7 +23,15 @@ public class MenadzerRestController { @PostMapping("/api/kreirajMenadzera") - public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzerDto) throws ParseException { + public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzerDto, HttpSession session) throws ParseException { + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Admin){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } String sDate1=menadzerDto.getDatumRodjenja(); Date date1= null; @@ -44,47 +52,27 @@ public ResponseEntity getRestoran(HttpSession session){ if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } + Restoran restoran = menadzerService.findRestoran(loggedKorisnik.getId()); return ResponseEntity.ok(restoran); } -/* @GetMapping("/api/pregledPorudzbina") - public ResponseEntity> getPorudzbine(HttpSession session){ - List listaPorudzbina = new ArrayList<>(); - Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + @DeleteMapping("/api/ukloniArtikal/{id}") + public ResponseEntity> ukloniArtikal(@PathVariable(name = "id") Long id, HttpSession session){ + Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); + + if(loggedKorisnik.getRestoran()== null){ + return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); + } + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } - Restoran restoran = menadzerService.findRestoran(loggedKorisnik.getId()); - - - } -*/ -/* @GetMapping("/api/kupci") - public List getKupci(){ - List kupacList = kupacService.findAll(); - return kupacList; + List l = menadzerService.removeArtikal(id, loggedKorisnik.getRestoran()); + return ResponseEntity.ok(l); } - @GetMapping("/api/employees/{id}") - public Kupac getEmployee(@PathVariable(name = "id") Long id){ - Kupac employee = employeeService.findOne(id); - return employee; - } - - @PostMapping("/api/save-employee") - public String saveEmployee(@RequestBody Employee employee) { - this.employeeService.save(employee); - return "Successfully saved an employee!"; - } - @GetMapping("/api/delById/{id}") - public String deleteEmployee(@PathVariable(name = "id") Long id){ - Employee employee = employeeService.findOne(id); - this.employeeService.delete(employee); - return "Sucessfully deleted and employee!"; - } -*/ } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java new file mode 100644 index 0000000..830ca30 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -0,0 +1,99 @@ +package vezbe.demo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.ArtikalDto; +import vezbe.demo.dto.NoviMenadzerDto; +import vezbe.demo.dto.RestoranDto; +import vezbe.demo.model.*; +import vezbe.demo.service.ArtikalService; +import vezbe.demo.service.RestoranService; + +import javax.servlet.http.HttpSession; +import java.util.List; +import java.util.Set; + +@RestController +public class RestoranRestController { + + @Autowired + private RestoranService restoranService; + + + @GetMapping("/api") + public ResponseEntity> api(){ + + return ResponseEntity.ok(restoranService.findAll()); + } + + + @PostMapping("/api/kreirajRestoran") + public ResponseEntity kreirajRestoran(@RequestBody RestoranDto restoranDto, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Admin){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + + Restoran restoran = new Restoran(restoranDto.getNaziv(), restoranDto.getTipRestorana()); + this.restoranService.save(restoran); + + return ResponseEntity.ok("Uspesno kreiranje restorana!"); + } + @GetMapping("/api/{naziv}") + public ResponseEntity getRestoranByNaziv(@PathVariable(name = "naziv") String naziv){ + + return ResponseEntity.ok(restoranService.findByName(naziv)); + } + @GetMapping("/api/tipRestorana/{tipRestorana}") + public ResponseEntity> getRestoranByTipRestorana(@PathVariable(name = "tipRestorana") String tipRestorana){ + + return ResponseEntity.ok(restoranService.findByTip(tipRestorana)); + } + @GetMapping("/api/lokacijaRestorana/{lokacija}") + public ResponseEntity getRestoranByLokacija(@PathVariable(name = "lokacija") String lokacija){ + + return ResponseEntity.ok(restoranService.findByLokacija(lokacija)); + } + @PostMapping("/api/dodajArtikal") + public ResponseEntity> dodajArtikal(@RequestBody ArtikalDto artikalDto, HttpSession session){ + Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); + + if(loggedKorisnik.getRestoran()== null){ + return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); + } + + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + TipArtikla tipArtikla = TipArtikla.valueOf(artikalDto.getTipArtikla()); + + Artikal artikal = new Artikal(artikalDto.getNaziv(), artikalDto.getCena(), tipArtikla); + + Set l = restoranService.dodajArtikal(artikal, loggedKorisnik.getRestoran()); + + + return ResponseEntity.ok(l); + + } + @PutMapping("/api/restoran/promeniMenadzera") + public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dto, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Admin){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + + Menadzer menadzer= restoranService.findByNaziv(dto.getNaziv(), dto.getKorisnickoIme()); + + return ResponseEntity.ok(menadzer); + } + + +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java new file mode 100644 index 0000000..bc1daad --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java @@ -0,0 +1,76 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.TipArtikla; + + +public class ArtikalDto { + private String naziv; + private double cena; + + private String tipArtikla; + + private double kolicina; + + private String opis; + + //SLIKU?????????????????? + //OPCIONI????????????? + + public ArtikalDto(String naziv, double cena, String tipArtikla, double kolicina, String opis) { + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + this.kolicina = kolicina; + this.opis = opis; + } + + public ArtikalDto() { + } + + public ArtikalDto(String naziv, double cena, String tipArtikla) { + + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public double getCena() { + return cena; + } + + public void setCena(double cena) { + this.cena = cena; + } + + public String getTipArtikla() { + return tipArtikla; + } + + public void setTipArtikla(String tipArtikla) { + this.tipArtikla = tipArtikla; + } + + public double getKolicina() { + return kolicina; + } + + public void setKolicina(double kolicina) { + this.kolicina = kolicina; + } + + public String getOpis() { + return opis; + } + + public void setOpis(String opis) { + this.opis = opis; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java new file mode 100644 index 0000000..5fd4c33 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java @@ -0,0 +1,43 @@ +package vezbe.demo.dto; + +import javax.persistence.Column; + +public class LokacijaDto { + private double geoDuzina; + private double geoSirina; + private String adresa; + + + public double getGeoDuzina() { + return geoDuzina; + } + + public void setGeoDuzina(double geoDuzina) { + this.geoDuzina = geoDuzina; + } + + public double getGeoSirina() { + return geoSirina; + } + + public void setGeoSirina(double geoSirina) { + this.geoSirina = geoSirina; + } + + public String getAdresa() { + return adresa; + } + + public void setAdresa(String adresa) { + this.adresa = adresa; + } + + public LokacijaDto() { + } + + public LokacijaDto(double geoDuzina, double geoSirina, String adresa) { + this.geoDuzina = geoDuzina; + this.geoSirina = geoSirina; + this.adresa = adresa; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/NoviMenadzerDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/NoviMenadzerDto.java new file mode 100644 index 0000000..1bd6d3a --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/NoviMenadzerDto.java @@ -0,0 +1,30 @@ +package vezbe.demo.dto; + +public class NoviMenadzerDto { + private String korisnickoIme; + private String naziv; + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public NoviMenadzerDto() { + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public NoviMenadzerDto(String korisnickoIme, String naziv) { + this.korisnickoIme = korisnickoIme; + this.naziv = naziv; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java new file mode 100644 index 0000000..df73fb5 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java @@ -0,0 +1,31 @@ +package vezbe.demo.dto; + + +public class RestoranDto { + private String naziv; + private String tipRestorana; + + public RestoranDto() { + } + + public RestoranDto(String naziv, String tipRestorana) { + this.naziv = naziv; + this.tipRestorana = tipRestorana; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public String getTipRestorana() { + return tipRestorana; + } + + public void setTipRestorana(String tipRestorana) { + this.tipRestorana = tipRestorana; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java index 09274b7..ae1985e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java @@ -31,6 +31,12 @@ public Artikal(String naziv, int cena, TipArtikla tipArtikla, int kolicina, Stri this.opis = opis; } + public Artikal(String naziv, double cena, TipArtikla tipArtikla) { + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + } + public Long getId() { return id; } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Lokacija.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Lokacija.java index ff6d483..e272e3a 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Lokacija.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Lokacija.java @@ -9,7 +9,7 @@ public class Lokacija implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private double geoDuzina; - private double geoSirina;//double + private double geoSirina; @Column(nullable = false) private String adresa; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java index 078dd39..1dbcec3 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Restoran.java @@ -41,6 +41,11 @@ public Restoran(String naziv, String tipRestorana, Lokacija lokacija) { this.lokacija = lokacija; } + public Restoran(String naziv, String tipRestorana) { + this.naziv = naziv; + this.tipRestorana = tipRestorana; + } + public Long getId() { return id; } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/repository/MenadzerRepository.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/repository/MenadzerRepository.java index ce08fdf..49d7d10 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/repository/MenadzerRepository.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/repository/MenadzerRepository.java @@ -4,4 +4,5 @@ import vezbe.demo.model.Menadzer; public interface MenadzerRepository extends JpaRepository { + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java new file mode 100644 index 0000000..1c95824 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java @@ -0,0 +1,30 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Artikal; +import vezbe.demo.model.Restoran; +import vezbe.demo.repository.ArtikalRepository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@Service +public class ArtikalService { + + @Autowired + private ArtikalRepository artikalRepository; + + public Set dodajArtikal(Artikal artikal, Restoran restoran){ + artikalRepository.save(artikal); + restoran.getPonuda().add(artikal); + + /* List lista = new ArrayList<>(); + for(Artikal artikal: restoran.getPonuda()){ + lista.add(artikal); + } +*/ + return restoran.getPonuda(); + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/LokacijaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/LokacijaService.java new file mode 100644 index 0000000..ce75304 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/LokacijaService.java @@ -0,0 +1,16 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Lokacija; +import vezbe.demo.repository.LokacijaRepository; + +@Service +public class LokacijaService { + @Autowired + private LokacijaRepository lokacijaRepository; + + public void save(Lokacija lokacija){ + this.lokacijaRepository.save(lokacija); + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java index 0156354..ff9fac6 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java @@ -5,6 +5,7 @@ import vezbe.demo.model.*; import vezbe.demo.repository.MenadzerRepository; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -41,10 +42,31 @@ public Restoran findRestoran(Long ID){ } return null; } - /* public List findPorudzbine(Long ID){ - Restoran r = findRestoran(ID); - for(Artikal artikal: r.getPonuda()){ - for() + public List removeArtikal(Long id, Restoran restoran) { + Artikal a= null; + for(Artikal artikal: restoran.getPonuda()){ + if(artikal.getId().equals(id)){ + a = artikal; + break; + } + } + restoran.getPonuda().remove(a); + List l= new ArrayList<>(); + for(Artikal artikal:restoran.getPonuda()){ + l.add(artikal); } - }*/ + return l; + } + public Menadzer postaviNovogMenadzera(String korisnickoIme, Restoran restoran){ + Menadzer m = null; + for(Menadzer menadzer: menadzerRepository.findAll()){ + if(menadzer.getKorisnickoIme().equals(korisnickoIme)){ + m = menadzer; + } + } + m.setRestoran(restoran); + menadzerRepository.save(m); + return m; + } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java new file mode 100644 index 0000000..dad2ada --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -0,0 +1,77 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.dto.RestoranDto; +import vezbe.demo.model.Artikal; +import vezbe.demo.model.Menadzer; +import vezbe.demo.model.Restoran; +import vezbe.demo.repository.RestoranRepository; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +public class RestoranService { + @Autowired + private RestoranRepository restoranRepository; + + @Autowired MenadzerService menadzerService; + + @Autowired + private ArtikalService artikalService; + + public Restoran save(Restoran restoran){ + return restoranRepository.save(restoran); + } + public List findAll(){return restoranRepository.findAll();}; + public Restoran findByName(String naziv){ + Restoran r = null; + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getNaziv().equals(naziv)){ + r= restoran; + } + } + return r; + } + public List findByTip(String tipRestorana){ + List lista= new ArrayList<>(); + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getTipRestorana().equals(tipRestorana)){ + lista.add(restoran); + } + } + return lista; + } + public Restoran findByLokacija(String adresa){ + Restoran r = null; + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getLokacija().getAdresa().equals(adresa)){ + r= restoran; + } + } + return r; + } + + public ArtikalService getArtikalService() { + return artikalService; + } + public Set dodajArtikal(Artikal artikal, Restoran restoran){ + Set novaLista = new HashSet<>(); + novaLista = artikalService.dodajArtikal(artikal, restoran); + restoranRepository.save(restoran); + return novaLista; + } + public Menadzer findByNaziv(String naziv, String KorisnickoIme){ + Restoran r = null; + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getNaziv().equals(naziv)){ + r= restoran; + } + } + return menadzerService.postaviNovogMenadzera(KorisnickoIme, r); + + } +} From 1afb22a69964d1725b19c647fde28d0e550b9ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 15 May 2022 11:03:46 +0200 Subject: [PATCH 06/27] Kupac pregled svojih porudzvina Dodali smo mogucnost pregleda liste porudzbina od strane ulogovanog kupca. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../configuration/DatabaseConfiguration.java | 4 +- .../demo/controller/KupacRestController.java | 46 ++++++++----------- .../controller/PorudzbinaRestController.java | 3 +- .../src/main/java/vezbe/demo/model/Kupac.java | 1 - .../java/vezbe/demo/model/Porudzbina.java | 1 + .../java/vezbe/demo/service/KupacService.java | 8 ++++ .../vezbe/demo/service/PorudzbinaService.java | 22 +++++---- 7 files changed, 45 insertions(+), 40 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index 5731f6b..5ae3c3b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -180,6 +180,7 @@ public boolean instantiate(){ Kupac kupac2= new Kupac("korisnickoIme2", "lozinka2", "Predrag", "Nenadic",Pol.muski,new Date(100, Calendar.JANUARY, 10), novaListaPorudzbina, 1100, srebrni); kupacRepository.save(kupac2); + Porudzbina porudzbina2 = new Porudzbina(); porudzbina2.setPoruceniArtikli(lista_artikala2); porudzbina2.setRestoran(restoran); @@ -188,10 +189,11 @@ public boolean instantiate(){ porudzbina2.setKupac(kupac2); porudzbina2.setStatus(StatusPorudzbine.UPripremi); porudzbinaRepository.save(porudzbina2); + kupacRepository.save(kupac2); kupac2.getListaPorudzbina().add(porudzbina2); Porudzbina porudzbina = new Porudzbina( lista_artikala, restoran, date1 , 123000,kupac2, StatusPorudzbine.UPripremi); porudzbinaRepository.save(porudzbina); - + kupacRepository.save(kupac2); Date date = new Date(); Menadzer menadzer = new Menadzer("menadzer123", "lozinka", "Milos", "Subotic", Pol.muski,date , restoran); menadzerRepository.save(menadzer); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 2a77c84..3c33cc1 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -17,6 +17,8 @@ import java.util.List; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Set; + @RestController public class KupacRestController { @@ -40,34 +42,22 @@ public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throw return ResponseEntity.ok("Uspesna registracija!"); } + @GetMapping("/api/svePorudzbine") + public ResponseEntity> sveProduzbine(HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + //Kupac kupac = (Kupac) loggedKorisnik; + if(kupacService.findAllPorudzbineByID(loggedKorisnik.getId()).isEmpty()){ + System.out.println("PRAZNA LISTA"); + ResponseEntity.noContent(); + } + return ResponseEntity.ok( kupacService.findAllPorudzbineByID(loggedKorisnik.getId())); - - - - -/* @GetMapping("/api/kupci") - public List getKupci(){ - List kupacList = kupacService.findAll(); - - return kupacList; - } - - @GetMapping("/api/employees/{id}") - public Kupac getEmployee(@PathVariable(name = "id") Long id){ - Kupac employee = employeeService.findOne(id); - return employee; - } - - @PostMapping("/api/save-employee") - public String saveEmployee(@RequestBody Employee employee) { - this.employeeService.save(employee); - return "Successfully saved an employee!"; - } - @GetMapping("/api/delById/{id}") - public String deleteEmployee(@PathVariable(name = "id") Long id){ - Employee employee = employeeService.findOne(id); - this.employeeService.delete(employee); - return "Sucessfully deleted and employee!"; } -*/ } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 7deb52c..f6ee416 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -12,6 +12,7 @@ import javax.servlet.http.HttpSession; import java.util.ArrayList; import java.util.List; +import java.util.Set; @RestController public class PorudzbinaRestController { @@ -33,6 +34,6 @@ public ResponseEntity> getPorudzbine(HttpSession session) { return ResponseEntity.ok(listaPorudzbina); - } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index 2252bd1..9544657 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -12,7 +12,6 @@ public class Kupac extends Korisnik implements Serializable { @Column(name = "porudzbina_id") @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy="kupac") - @JsonIgnore private Set listaPorudzbina = new HashSet<>(); private int bodovi; @OneToOne diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java index d1ffe8b..e8be1d0 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java @@ -33,6 +33,7 @@ public class Porudzbina implements Serializable { private double cena; @ManyToOne @JoinColumn(name = "kupac_id") + @JsonIgnore private Kupac kupac; @Enumerated(EnumType.STRING) private StatusPorudzbine statusPorudzbine; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index df41abb..6db2e7f 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -3,10 +3,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import vezbe.demo.model.Kupac; +import vezbe.demo.model.Porudzbina; import vezbe.demo.repository.KupacRepository; import java.util.List; import java.util.Optional; +import java.util.Set; @Service public class KupacService { @@ -31,4 +33,10 @@ public Kupac save(Kupac kupac){ } public void delete(Kupac kupac){kupacRepository.delete(kupac);} + + + public Set findAllPorudzbineByID(Long id){ + return kupacRepository.getById(id).getListaPorudzbina(); + } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index fd67403..e59c9f7 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -2,27 +2,29 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import vezbe.demo.model.Artikal; -import vezbe.demo.model.Porudzbina; -import vezbe.demo.model.Restoran; -import vezbe.demo.model.StavkaPorudzbine; +import vezbe.demo.model.*; +import vezbe.demo.repository.KupacRepository; import vezbe.demo.repository.PorudzbinaRepository; import vezbe.demo.repository.StavkaPorudzbineRepository; import java.util.ArrayList; import java.util.List; +import java.util.Set; @Service public class PorudzbinaService { @Autowired PorudzbinaRepository porudzbinaRepository; - public List getListaPorudzbina(Restoran restoran){ + @Autowired + KupacRepository kupacRepository; + + public List getListaPorudzbina(Restoran restoran) { List listaPorudzbina = new ArrayList<>(); - for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ - for(StavkaPorudzbine stavkaPorudzbine: porudzbina.getPoruceniArtikli()){ - for(Artikal artikal: restoran.getPonuda()){ - if(stavkaPorudzbine.getPoruceniArtikal().getId().equals(artikal.getId())) { + for (Porudzbina porudzbina : porudzbinaRepository.findAll()) { + for (StavkaPorudzbine stavkaPorudzbine : porudzbina.getPoruceniArtikli()) { + for (Artikal artikal : restoran.getPonuda()) { + if (stavkaPorudzbine.getPoruceniArtikal().getId().equals(artikal.getId())) { listaPorudzbina.add(porudzbina); break; } @@ -32,4 +34,6 @@ public List getListaPorudzbina(Restoran restoran){ } return listaPorudzbina; } + } + From 61d717b4a9d8f9ea47386f3415dce52f7693a6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 15 May 2022 11:17:55 +0200 Subject: [PATCH 07/27] Kupac pregled porudzbina Dodali smo mogucnost pregleda svojih porudzbina od strane ulogovanog kupca Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/DostavljacRestController.java | 38 +++++-------------- .../vezbe/demo/service/DostavljacService.java | 6 +++ 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java index c993f7b..3592f57 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java @@ -11,8 +11,11 @@ import vezbe.demo.service.MenadzerService; import javax.servlet.http.HttpSession; import java.text.ParseException; +import java.util.ArrayList; import java.util.Date; import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Set; @RestController public class DostavljacRestController { @@ -21,7 +24,6 @@ public class DostavljacRestController { private DostavljacService dostavljacService; - //TREBA DODATI DA LI JE NA SESIJI ADMIN, AKO NIJE ONDA NEKI BAD REQUEST, TO SAM DODAO SAD @PostMapping("/api/kreirajDostavljaca") public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto, HttpSession session) throws ParseException { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -43,38 +45,18 @@ public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dost return ResponseEntity.ok("Uspesno kreiranje dostavljaca!"); } - // @PostMapping("/api/registracija") - /* public ResponseEntity registracija(@RequestBody KupacDto kupacDto){ + @GetMapping("/api/dostavljac/pregledPorudzbina") + public ResponseEntity> pregledPorudzbina(HttpSession session) { - return ResponseEntity.ok("Successfully logged in!"); - }*/ - + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik.getUloga() != Uloga.Dostavljac ) {//Da li treba dodati i mogucnost da admin moze da pristupa ovom edpointu + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } -/* @GetMapping("/api/kupci") - public List getKupci(){ - List kupacList = kupacService.findAll(); - return kupacList; - } + return ResponseEntity.ok(dostavljacService.findAllById(loggedKorisnik.getId())); - @GetMapping("/api/employees/{id}") - public Kupac getEmployee(@PathVariable(name = "id") Long id){ - Kupac employee = employeeService.findOne(id); - return employee; - } - - @PostMapping("/api/save-employee") - public String saveEmployee(@RequestBody Employee employee) { - this.employeeService.save(employee); - return "Successfully saved an employee!"; - } - @GetMapping("/api/delById/{id}") - public String deleteEmployee(@PathVariable(name = "id") Long id){ - Employee employee = employeeService.findOne(id); - this.employeeService.delete(employee); - return "Sucessfully deleted and employee!"; } -*/ } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java index b22e7af..e72c87b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java @@ -5,11 +5,13 @@ import vezbe.demo.model.Dostavljac; import vezbe.demo.model.Kupac; import vezbe.demo.model.Menadzer; +import vezbe.demo.model.Porudzbina; import vezbe.demo.repository.DostavljacRepository; import vezbe.demo.repository.MenadzerRepository; import java.util.List; import java.util.Optional; +import java.util.Set; @Service public class DostavljacService { @@ -34,4 +36,8 @@ public Dostavljac save(Dostavljac dostavljac){ } public void delete(Dostavljac dostavljac){dostavljacRepository.delete(dostavljac);} + + public Set findAllById(Long id){ + return dostavljacRepository.getById(id).getPorudzbineZaDostavu(); + } } From c913f10085747e8d266aa38f9ca397c50cf0d872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 15 May 2022 11:27:56 +0200 Subject: [PATCH 08/27] Porudzbine u stanju cekaDostavljaca Dodali smo dostavljacima mogucnost pregleda svih porudzbina u stanju cekaDostavljaca Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../demo/configuration/DatabaseConfiguration.java | 2 +- .../demo/controller/PorudzbinaRestController.java | 14 ++++++++++++++ .../java/vezbe/demo/service/PorudzbinaService.java | 11 ++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index 5ae3c3b..817078b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -191,7 +191,7 @@ public boolean instantiate(){ porudzbinaRepository.save(porudzbina2); kupacRepository.save(kupac2); kupac2.getListaPorudzbina().add(porudzbina2); - Porudzbina porudzbina = new Porudzbina( lista_artikala, restoran, date1 , 123000,kupac2, StatusPorudzbine.UPripremi); + Porudzbina porudzbina = new Porudzbina( lista_artikala, restoran, date1 , 123000,kupac2, StatusPorudzbine.CekaDostavljača); porudzbinaRepository.save(porudzbina); kupacRepository.save(kupac2); Date date = new Date(); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index f6ee416..d106c0f 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -36,4 +36,18 @@ public ResponseEntity> getPorudzbine(HttpSession session) { } + @GetMapping("/api/dostavljac/cekaDostavljaca") + public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSession session) { + List listaPorudzbina = new ArrayList<>(); + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik.getUloga() != Uloga.Dostavljac) { + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + + + + return ResponseEntity.ok(porudzbinaService.findCekaDostavljaca()); + + } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index e59c9f7..909dd5d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -8,6 +8,7 @@ import vezbe.demo.repository.StavkaPorudzbineRepository; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -34,6 +35,14 @@ public List getListaPorudzbina(Restoran restoran) { } return listaPorudzbina; } - + public Set findCekaDostavljaca(){ + Set setp = new HashSet<>(); + for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ + if(porudzbina.getStatus().equals(StatusPorudzbine.CekaDostavljača)){ + setp.add(porudzbina); + } + } + return setp; + } } From 56a8f490e469cf0e531fdf5129ac0693a6f07f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 19 May 2022 12:45:55 +0200 Subject: [PATCH 09/27] Korpa Dodali smo: -1 endpoint za kreiranje porudzbine i stavljanje njenog statusa na "Obrada" -1 endpoint za dodavanje artikala u korpu koji trazi porudzbinu u statusu "Obrada" kod ulogovanog kupca i na nju dodaje artikle. -1 endpoint za uklanjanje elemenata iz porudzbine sa statusom "Obrada" Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/PorudzbinaRestController.java | 65 ++++++++++- .../controller/RestoranRestController.java | 5 +- .../main/java/vezbe/demo/dto/KorpaDto.java | 33 ++++++ .../main/java/vezbe/demo/dto/LokacijaDto.java | 2 - .../java/vezbe/demo/dto/RestoranImeDto.java | 20 ++++ .../java/vezbe/demo/model/Porudzbina.java | 8 ++ .../java/vezbe/demo/service/KupacService.java | 4 + .../vezbe/demo/service/PorudzbinaService.java | 103 +++++++++++++++++- .../vezbe/demo/service/RestoranService.java | 101 ++++++++++++----- .../demo/service/StavkaPorudzbineService.java | 25 +++++ 10 files changed, 326 insertions(+), 40 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorpaDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranImeDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/StavkaPorudzbineService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index d106c0f..9bd4314 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -3,16 +3,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.LokacijaDto; +import vezbe.demo.dto.RestoranImeDto; import vezbe.demo.model.*; import vezbe.demo.service.MenadzerService; import vezbe.demo.service.PorudzbinaService; +import vezbe.demo.dto.KorpaDto; + import javax.servlet.http.HttpSession; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; @RestController public class PorudzbinaRestController { @@ -49,5 +50,59 @@ public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSessi return ResponseEntity.ok(porudzbinaService.findCekaDostavljaca()); } + @PostMapping("/api/kreiraj-porudzbinu") + public ResponseEntity kreirajPorudzbinu(@RequestBody RestoranImeDto restoranImeDto, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + Kupac kupac = (Kupac) loggedKorisnik; + + porudzbinaService.makePorudzbina(kupac, restoranImeDto.getNaziv()); + + return ResponseEntity.ok(porudzbinaService.getAll()); + + } + @PostMapping("/api/dodaj-u-korpu") + public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, HttpSession session){ + + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + Kupac kupac =(Kupac) loggedKorisnik; + + Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + + return ResponseEntity.ok(porudzbinaService.kreirajStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); + + } + @PostMapping("/api/ukloni-iz-korpe") + public ResponseEntity ukloniIzKorpe(@RequestBody KorpaDto korpaDto, HttpSession session){ + + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + Kupac kupac =(Kupac) loggedKorisnik; + + Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + + return ResponseEntity.ok(porudzbinaService.ukloniStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); + + + } + + + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 830ca30..eee5be5 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -5,6 +5,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.ArtikalDto; +import vezbe.demo.dto.KorpaDto; import vezbe.demo.dto.NoviMenadzerDto; import vezbe.demo.dto.RestoranDto; import vezbe.demo.model.*; @@ -12,8 +13,7 @@ import vezbe.demo.service.RestoranService; import javax.servlet.http.HttpSession; -import java.util.List; -import java.util.Set; +import java.util.*; @RestController public class RestoranRestController { @@ -96,4 +96,5 @@ public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dt } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorpaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorpaDto.java new file mode 100644 index 0000000..1ce91f9 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorpaDto.java @@ -0,0 +1,33 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.Artikal; + +public class KorpaDto { + private String artikal; + private int kolicina; + + public KorpaDto() { + + } + + public KorpaDto( String artikal, int kolicina) { + this.artikal = artikal; + this.kolicina = kolicina; + } + + public String getArtikal() { + return artikal; + } + + public void setArtikal(String artikal) { + this.artikal = artikal; + } + + public int getKolicina() { + return kolicina; + } + + public void setKolicina(int kolicina) { + this.kolicina = kolicina; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java index 5fd4c33..825f0da 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java @@ -1,7 +1,5 @@ package vezbe.demo.dto; -import javax.persistence.Column; - public class LokacijaDto { private double geoDuzina; private double geoSirina; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranImeDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranImeDto.java new file mode 100644 index 0000000..533fac6 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranImeDto.java @@ -0,0 +1,20 @@ +package vezbe.demo.dto; + +public class RestoranImeDto { + private String naziv; + + public RestoranImeDto() { + } + + public RestoranImeDto(String naziv) { + this.naziv = naziv; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java index e8be1d0..48c1a30 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java @@ -44,6 +44,7 @@ public UUID getUUID() { } public Porudzbina() { + this.cena = 0; } public Porudzbina( Set poruceniArtikli, Restoran restoran, Date datumIVreme, long cena, Kupac kupac, StatusPorudzbine statusPorudzbine) { @@ -54,6 +55,13 @@ public Porudzbina( Set poruceniArtikli, Restoran restoran, Dat this.kupac =kupac; this.statusPorudzbine = statusPorudzbine; } + public Porudzbina(Kupac kupac,Restoran restoran, StatusPorudzbine statusPorudzbine,Date datumIVreme) { + this.datumIVreme = datumIVreme; + this.statusPorudzbine = statusPorudzbine; + this.kupac = kupac; + this.restoran = restoran; + this.cena = 0; + } public void setUUID(UUID id) { this.id = id; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index 6db2e7f..2fd5de3 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -38,5 +38,9 @@ public Kupac save(Kupac kupac){ public Set findAllPorudzbineByID(Long id){ return kupacRepository.getById(id).getListaPorudzbina(); } + public void updateKupac(Kupac kupac, Porudzbina porudzbina){ + kupac.getListaPorudzbina().add(porudzbina); + kupacRepository.save(kupac); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index 909dd5d..fb0a620 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -1,16 +1,14 @@ package vezbe.demo.service; +import jdk.jshell.Snippet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import vezbe.demo.model.*; import vezbe.demo.repository.KupacRepository; import vezbe.demo.repository.PorudzbinaRepository; -import vezbe.demo.repository.StavkaPorudzbineRepository; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.text.SimpleDateFormat; +import java.util.*; @Service public class PorudzbinaService { @@ -18,7 +16,14 @@ public class PorudzbinaService { PorudzbinaRepository porudzbinaRepository; @Autowired - KupacRepository kupacRepository; + RestoranService restoranService; + + @Autowired + StavkaPorudzbineService stavkaPorudzbineService; + + @Autowired + KupacService kupacService; + public List getListaPorudzbina(Restoran restoran) { List listaPorudzbina = new ArrayList<>(); @@ -44,5 +49,91 @@ public Set findCekaDostavljaca(){ } return setp; } + public void dodajStavku(StavkaPorudzbine stavkaPorudzbine, Porudzbina porudzbina){ + Set lista = new HashSet<>(); + lista = porudzbina.getPoruceniArtikli(); + lista.add(stavkaPorudzbine); + porudzbina.setPoruceniArtikli(lista); + porudzbinaRepository.save(porudzbina); + } + public void makePorudzbina(Kupac kupac, String restoran){//TREBA FORMATIRATI OVE DATUME KAD ZAVRSIS + Restoran restoran1 = restoranService.findByRestoranIme(restoran); + // Date date= null; + // date = new Date("yyyy/dd/MM"); + Porudzbina porudzbina = new Porudzbina(kupac, restoran1, StatusPorudzbine.Obrada, new Date()); + porudzbinaRepository.save(porudzbina); + kupacService.updateKupac(kupac, porudzbina); + + } + public Porudzbina getAll(){ + Porudzbina p = null; + for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ + if(porudzbina.getStatus().equals(StatusPorudzbine.Obrada)){ + p = porudzbina; + } + } + return p; + } + public Porudzbina findByStatus(){ + Porudzbina p = null; + for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ + if(porudzbina.getStatus().equals(StatusPorudzbine.Obrada)) { + p = porudzbina; + } + } + return p; + } + public Porudzbina findByStatusAndKupac(Kupac kupac){ + Porudzbina p= null; + for(Porudzbina porudzbina: kupac.getListaPorudzbina()){ + if(porudzbina.getStatus().equals(StatusPorudzbine.Obrada)){ + p = porudzbina; + } + } + return p; + } + public Porudzbina kreirajStavkuPorudzbine(String naziv, int kolicina, Porudzbina porudzbina){ + StavkaPorudzbine stavkaPorudzbine = new StavkaPorudzbine(); + double temp = 0; + for(Artikal artikal: porudzbina.getRestoran().getPonuda()){ + if(artikal.getNaziv().equals(naziv)){ + stavkaPorudzbine.setPoruceniArtikal(artikal); + stavkaPorudzbine.setPorucenaKolicina(kolicina); + stavkaPorudzbineService.saveStavka(stavkaPorudzbine); + temp = artikal.getCena() * kolicina; + + } + } + porudzbina.getPoruceniArtikli().add(stavkaPorudzbine); + porudzbina.setCena(porudzbina.getCena() + temp); + + porudzbinaRepository.save(porudzbina); + + return porudzbina; + } + public Porudzbina ukloniStavkuPorudzbine(String naziv, int kolicina, Porudzbina porudzbina){ + double temp = 0; + for(StavkaPorudzbine stavkaPorudzbine: porudzbina.getPoruceniArtikli()){ + if(stavkaPorudzbine.getPoruceniArtikal().getNaziv().equals(naziv)){ + if(kolicina>=stavkaPorudzbine.getPorucenaKolicina()){ + temp = kolicina * stavkaPorudzbine.getPoruceniArtikal().getCena(); + stavkaPorudzbineService.removeStavka(stavkaPorudzbine); + porudzbina.getPoruceniArtikli().remove(stavkaPorudzbine); + break; + + }else{ + stavkaPorudzbine.setPorucenaKolicina(stavkaPorudzbine.getPorucenaKolicina() - kolicina); + temp = kolicina * stavkaPorudzbine.getPoruceniArtikal().getCena(); + break; + + } + } + } + + porudzbina.setCena(porudzbina.getCena() - temp); + porudzbinaRepository.save(porudzbina); + + return porudzbina; + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index dad2ada..69a083a 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -3,9 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import vezbe.demo.dto.RestoranDto; -import vezbe.demo.model.Artikal; -import vezbe.demo.model.Menadzer; -import vezbe.demo.model.Restoran; +import vezbe.demo.model.*; import vezbe.demo.repository.RestoranRepository; import java.util.ArrayList; @@ -18,38 +16,53 @@ public class RestoranService { @Autowired private RestoranRepository restoranRepository; - @Autowired MenadzerService menadzerService; + @Autowired + private MenadzerService menadzerService; @Autowired private ArtikalService artikalService; - public Restoran save(Restoran restoran){ + @Autowired + private StavkaPorudzbineService stavkaPorudzbineService; + + /* @Autowired + private PorudzbinaService porudzbinaService; + */ + public Restoran save(Restoran restoran) { return restoranRepository.save(restoran); } - public List findAll(){return restoranRepository.findAll();}; - public Restoran findByName(String naziv){ + + public List findAll() { + return restoranRepository.findAll(); + } + + ; + + public Restoran findByName(String naziv) { Restoran r = null; - for(Restoran restoran: restoranRepository.findAll()){ - if(restoran.getNaziv().equals(naziv)){ - r= restoran; + for (Restoran restoran : restoranRepository.findAll()) { + if (restoran.getNaziv().equals(naziv)) { + r = restoran; } } return r; } - public List findByTip(String tipRestorana){ - List lista= new ArrayList<>(); - for(Restoran restoran: restoranRepository.findAll()){ - if(restoran.getTipRestorana().equals(tipRestorana)){ + + public List findByTip(String tipRestorana) { + List lista = new ArrayList<>(); + for (Restoran restoran : restoranRepository.findAll()) { + if (restoran.getTipRestorana().equals(tipRestorana)) { lista.add(restoran); } } return lista; } - public Restoran findByLokacija(String adresa){ + + public Restoran findByLokacija(String adresa) { Restoran r = null; - for(Restoran restoran: restoranRepository.findAll()){ - if(restoran.getLokacija().getAdresa().equals(adresa)){ - r= restoran; + for (Restoran restoran : restoranRepository.findAll()) { + if (restoran.getLokacija().getAdresa().equals(adresa)) { + r = restoran; } } return r; @@ -58,20 +71,58 @@ public Restoran findByLokacija(String adresa){ public ArtikalService getArtikalService() { return artikalService; } - public Set dodajArtikal(Artikal artikal, Restoran restoran){ + + public Set dodajArtikal(Artikal artikal, Restoran restoran) { Set novaLista = new HashSet<>(); novaLista = artikalService.dodajArtikal(artikal, restoran); restoranRepository.save(restoran); - return novaLista; + return novaLista; } - public Menadzer findByNaziv(String naziv, String KorisnickoIme){ + + public Menadzer findByNaziv(String naziv, String KorisnickoIme) { Restoran r = null; - for(Restoran restoran: restoranRepository.findAll()){ - if(restoran.getNaziv().equals(naziv)){ - r= restoran; + for (Restoran restoran : restoranRepository.findAll()) { + if (restoran.getNaziv().equals(naziv)) { + r = restoran; + } + } + return menadzerService.postaviNovogMenadzera(KorisnickoIme, r);//IZMENI NAZIV OVE FUNKCIJE + + } + + public Restoran findByRestoranIme(String naziv) { + Restoran r = null; + for (Restoran restoran : restoranRepository.findAll()) { + if (restoran.getNaziv().equals(naziv)) { + r = restoran; } } - return menadzerService.postaviNovogMenadzera(KorisnickoIme, r); + return r; + } + + /*public void dodajUPorudzbinu(StavkaPorudzbine stavkaPorudzbine, Porudzbina porudzbina){ + porudzbinaService.dodajStavku(stavkaPorudzbine, porudzbina); + + } + + public void saveStavkaPorudzbine(StavkaPorudzbine stavkaPorudzbine){ + stavkaPorudzbineService.saveStavka(stavkaPorudzbine); + } + public Artikal findArtikal(String nazivRestorana, String nazivArtikla, int kolicina){ + Artikal a = null; + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getNaziv().equals(nazivRestorana)){ + for(Artikal artikal: restoran.getPonuda()){ + if(artikal.getNaziv().equals(nazivArtikla)){ + a = artikal; + } + } + } + } + stavkaPorudzbineService.addArtikal(a,kolicina); + return a; } + */ + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/StavkaPorudzbineService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/StavkaPorudzbineService.java new file mode 100644 index 0000000..0dafd0e --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/StavkaPorudzbineService.java @@ -0,0 +1,25 @@ +package vezbe.demo.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.model.Artikal; +import vezbe.demo.model.StavkaPorudzbine; +import vezbe.demo.repository.StavkaPorudzbineRepository; + +@Service +public class StavkaPorudzbineService { + @Autowired + StavkaPorudzbineRepository stavkaPorudzbineRepository; + + + public void addArtikal(Artikal artikal, int kolicina){ + StavkaPorudzbine stavkaPorudzbine = new StavkaPorudzbine(artikal, kolicina); + stavkaPorudzbineRepository.save(stavkaPorudzbine); + } + public void saveStavka(StavkaPorudzbine stavkaPorudzbine){ + stavkaPorudzbineRepository.save(stavkaPorudzbine); + } + public void removeStavka(StavkaPorudzbine stavkaPorudzbine){ + stavkaPorudzbineRepository.delete(stavkaPorudzbine); + } +} From 54760d21f5908a50941291ca432253f645ad7397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Fri, 20 May 2022 11:30:55 +0200 Subject: [PATCH 10/27] Poruci endpoint Dodali smo novi tip statusa porudzbine "USastavljanju" u kome ce se porudzbina cuvati na repozitorijumu tokom sastavljanja i dodali smo endpoint poruci koji ce promeniti status porudzbine u "Obrada" ukoliko porudzbina nije prazna. Ako je prazna endpoint poruci ce obrisati porudzbinu iz repozitorijuma. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/PorudzbinaRestController.java | 19 ++++++++++++++++++- .../vezbe/demo/model/StatusPorudzbine.java | 1 + .../vezbe/demo/service/PorudzbinaService.java | 12 ++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 9bd4314..0841822 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -99,9 +99,26 @@ public ResponseEntity ukloniIzKorpe(@RequestBody KorpaDto korpaDto, return ResponseEntity.ok(porudzbinaService.ukloniStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); - } + @PostMapping("/api/poruci") + public ResponseEntity poruci( HttpSession session) { + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + } + Kupac kupac =(Kupac) loggedKorisnik; + Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + porudzbinaService.checkIfEmpty(porudzbina); + if(porudzbina.getPoruceniArtikli().isEmpty()){ + return new ResponseEntity("Porudzbina je prazna", HttpStatus.BAD_REQUEST); + }else{ + return ResponseEntity.ok(porudzbina); + } + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/StatusPorudzbine.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/StatusPorudzbine.java index 321c023..5ee4373 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/StatusPorudzbine.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/StatusPorudzbine.java @@ -6,5 +6,6 @@ public enum StatusPorudzbine { CekaDostavljača, UTransportu, Dostavljena, + USastavljanu, Otkazana; } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index fb0a620..5c6f5be 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -60,7 +60,7 @@ public void makePorudzbina(Kupac kupac, String restoran){//TREBA FORMATIRATI OVE Restoran restoran1 = restoranService.findByRestoranIme(restoran); // Date date= null; // date = new Date("yyyy/dd/MM"); - Porudzbina porudzbina = new Porudzbina(kupac, restoran1, StatusPorudzbine.Obrada, new Date()); + Porudzbina porudzbina = new Porudzbina(kupac, restoran1, StatusPorudzbine.USastavljanu, new Date()); porudzbinaRepository.save(porudzbina); kupacService.updateKupac(kupac, porudzbina); @@ -86,7 +86,7 @@ public Porudzbina findByStatus(){ public Porudzbina findByStatusAndKupac(Kupac kupac){ Porudzbina p= null; for(Porudzbina porudzbina: kupac.getListaPorudzbina()){ - if(porudzbina.getStatus().equals(StatusPorudzbine.Obrada)){ + if(porudzbina.getStatus().equals(StatusPorudzbine.USastavljanu)){ p = porudzbina; } } @@ -135,5 +135,13 @@ public Porudzbina ukloniStavkuPorudzbine(String naziv, int kolicina, Porudzbina return porudzbina; } + public void checkIfEmpty(Porudzbina porudzbina){ + if(porudzbina.getPoruceniArtikli().isEmpty()){ + porudzbinaRepository.delete(porudzbina); + }else{ + porudzbina.setStatusPorudzbine(StatusPorudzbine.Obrada); + porudzbinaRepository.save(porudzbina); + } + } } From d12eee7b40c32a1f761c0c616f06cfc7a028b2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Wed, 25 May 2022 16:53:30 +0200 Subject: [PATCH 11/27] Dodata slika artiklu Dodali smo String polje u klasi Artikal koje ce sadrzati naziv datoteke slike. Dodali smo u restController-u cuvanje slike u folder images. Dodali smo klasu ce osigurati da se slika sacuva u odgovarajuci folder, i ako on ne postoji ova klasa ce ga kreirati. Dodali smo konfiguracionu klasu MvcConfig koja sluzi za dobavljanje slike za prikaz na sajt. Ona je za sad beskorisna jer jos uvek nemamo front-end, ali moze biti korisna kasnije. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../vezbe/demo/configuration/MvcConfig.java | 28 +++++++++ .../controller/RestoranRestController.java | 21 ++++++- .../main/java/vezbe/demo/dto/ArtikalDto.java | 43 +++++++++++++ .../main/java/vezbe/demo/model/Artikal.java | 59 ++++++++++++++++++ .../java/vezbe/demo/model/FileUploadUtil.java | 26 ++++++++ .../main/resources/static/images/12/hamb.jpg | Bin 0 -> 7415 bytes .../src/main/resources/static/images/hamb.jpg | Bin 0 -> 7415 bytes .../main/resources/static/images/sdasd.jpg | Bin 0 -> 140083 bytes .../src/main/resources/static/images/user.jpg | Bin 0 -> 16526 bytes .../src/main/resources/static/images/user.png | 0 .../main/resources/static/images12/hamb.jpg | Bin 0 -> 7415 bytes .../main/resources/static/images13/hamb.jpg | Bin 0 -> 7415 bytes 12 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/MvcConfig.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/model/FileUploadUtil.java create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/12/hamb.jpg create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/hamb.jpg create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/sdasd.jpg create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/user.jpg delete mode 100644 Nadogradnja-demoa/src/main/resources/static/images/user.png create mode 100644 Nadogradnja-demoa/src/main/resources/static/images12/hamb.jpg create mode 100644 Nadogradnja-demoa/src/main/resources/static/images13/hamb.jpg diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/MvcConfig.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/MvcConfig.java new file mode 100644 index 0000000..2ee8ede --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/MvcConfig.java @@ -0,0 +1,28 @@ +package vezbe.demo.configuration; + + +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class MvcConfig implements WebMvcConfigurer { + + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + exposeDirectory("images", registry); + } + + private void exposeDirectory(String dirName, ResourceHandlerRegistry registry) { + Path uploadDir = Paths.get(dirName); + //String uploadPath = uploadDir.toFile().getAbsolutePath(); + String uploadPath = uploadDir.toFile().getAbsolutePath() + "Nadogradnja-demoa/src/main/resources/static/images"; + if (dirName.startsWith("../")) dirName = dirName.replace("../", ""); + + registry.addResourceHandler("/" + dirName + "/**").addResourceLocations("file:/"+ uploadPath + "/"); + } +} \ No newline at end of file diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index eee5be5..0a76297 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -3,7 +3,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.view.RedirectView; import vezbe.demo.dto.ArtikalDto; import vezbe.demo.dto.KorpaDto; import vezbe.demo.dto.NoviMenadzerDto; @@ -13,6 +16,7 @@ import vezbe.demo.service.RestoranService; import javax.servlet.http.HttpSession; +import java.io.IOException; import java.util.*; @RestController @@ -60,7 +64,7 @@ public ResponseEntity getRestoranByLokacija(@PathVariable(name = "loka return ResponseEntity.ok(restoranService.findByLokacija(lokacija)); } @PostMapping("/api/dodajArtikal") - public ResponseEntity> dodajArtikal(@RequestBody ArtikalDto artikalDto, HttpSession session){ + public ResponseEntity> dodajArtikal( @RequestParam("image") MultipartFile multipartFile,ArtikalDto artikalDto, HttpSession session) throws IOException { Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); if(loggedKorisnik.getRestoran()== null){ @@ -74,12 +78,23 @@ public ResponseEntity> dodajArtikal(@RequestBody ArtikalDto artikal Artikal artikal = new Artikal(artikalDto.getNaziv(), artikalDto.getCena(), tipArtikla); - Set l = restoranService.dodajArtikal(artikal, loggedKorisnik.getRestoran()); + String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename()); + artikal.setSlika(fileName); + //String uploadDir = "artikal-slike/" + artikal.getId(); + String uploadDir = "src/main/resources/static/images/" + artikal.getId(); - return ResponseEntity.ok(l); + FileUploadUtil.saveFile(uploadDir, fileName, multipartFile); + + + Set listaArtikala = restoranService.dodajArtikal(artikal, loggedKorisnik.getRestoran()); + + + return ResponseEntity.ok(listaArtikala); } + + @PutMapping("/api/restoran/promeniMenadzera") public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java index bc1daad..42f3d57 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/ArtikalDto.java @@ -1,7 +1,13 @@ package vezbe.demo.dto; +import com.fasterxml.jackson.annotation.JsonSetter; import vezbe.demo.model.TipArtikla; +import javax.persistence.Column; +import javax.persistence.Lob; +import java.io.UnsupportedEncodingException; +import java.util.Base64; + public class ArtikalDto { private String naziv; @@ -13,6 +19,24 @@ public class ArtikalDto { private String opis; + /*@Lob + @Column(name = "slika") + private byte[] slika; + + @JsonSetter("slika") + public void setSlika(String content) { + try { + this.slika = Base64.getDecoder().decode(content.getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + public byte[] getSlika() { + return slika; + } + */ + //SLIKU?????????????????? //OPCIONI????????????? @@ -24,6 +48,16 @@ public ArtikalDto(String naziv, double cena, String tipArtikla, double kolicina, this.opis = opis; } + /*public ArtikalDto(String naziv, double cena, String tipArtikla, double kolicina, String opis, byte[] slika) { + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + this.kolicina = kolicina; + this.opis = opis; + this.slika = slika; + } + */ + public ArtikalDto() { } @@ -33,6 +67,15 @@ public ArtikalDto(String naziv, double cena, String tipArtikla) { this.cena = cena; this.tipArtikla = tipArtikla; } + /* + + public ArtikalDto(String naziv, double cena, String tipArtikla, byte[] slika) { + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + this.slika = slika; + } + */ public String getNaziv() { return naziv; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java index ae1985e..54ebfab 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Artikal.java @@ -1,7 +1,11 @@ package vezbe.demo.model; +import com.fasterxml.jackson.annotation.JsonSetter; + import javax.persistence.*; import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Base64; @Entity public class Artikal implements Serializable { @@ -20,9 +24,48 @@ public class Artikal implements Serializable { private String opis; + @Column(nullable = true, length = 64) + private String slika; + + @Transient + public String SlikaImagePath() { + if (slika == null || id == null) return null; + + //return "/artikal-slike/" + id + "/" + slika; + return "/src/main/resources/static/images/"+ id + "/" + slika; + } + + + /*@Lob + @Column(name = "slika") + private byte[] slika; + + @JsonSetter("slika") + public void setSlika(String content) { + try { + this.slika = Base64.getDecoder().decode(content.getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + public byte[] getSlika() { + return slika; + } +*/ public Artikal() { } + public Artikal(Long id, String naziv, double cena, TipArtikla tipArtikla, double kolicina, String opis, String slika) { + this.id = id; + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + this.kolicina = kolicina; + this.opis = opis; + this.slika = slika; + } + public Artikal(String naziv, int cena, TipArtikla tipArtikla, int kolicina, String opis) { this.naziv = naziv; this.cena = cena; @@ -31,12 +74,28 @@ public Artikal(String naziv, int cena, TipArtikla tipArtikla, int kolicina, Stri this.opis = opis; } + public String getSlika() { + return slika; + } + + public void setSlika(String slika) { + this.slika = slika; + } + + public Artikal(String naziv, double cena, TipArtikla tipArtikla) { this.naziv = naziv; this.cena = cena; this.tipArtikla = tipArtikla; } + /* public Artikal(String naziv, double cena, TipArtikla tipArtikla, byte[] slika) { + this.naziv = naziv; + this.cena = cena; + this.tipArtikla = tipArtikla; + this.slika = slika; + } + */ public Long getId() { return id; } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/FileUploadUtil.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/FileUploadUtil.java new file mode 100644 index 0000000..2c4c282 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/FileUploadUtil.java @@ -0,0 +1,26 @@ +package vezbe.demo.model; + +import java.io.*; +import java.nio.file.*; + +import org.springframework.web.multipart.MultipartFile; + +public class FileUploadUtil { + + public static void saveFile(String uploadDir, String fileName, + MultipartFile multipartFile) throws IOException { + Path uploadPath = Paths.get(uploadDir); + + if (!Files.exists(uploadPath)) { + Files.createDirectories(uploadPath); + } + + + try (InputStream inputStream = multipartFile.getInputStream()) { + Path filePath = uploadPath.resolve(fileName); + Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException ioe) { + throw new IOException("Could not save image file: " + fileName, ioe); + } + } +} diff --git a/Nadogradnja-demoa/src/main/resources/static/images/12/hamb.jpg b/Nadogradnja-demoa/src/main/resources/static/images/12/hamb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cab5bab75aeef1c6d13197966d73467348563be GIT binary patch literal 7415 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 literal 0 HcmV?d00001 diff --git a/Nadogradnja-demoa/src/main/resources/static/images/hamb.jpg b/Nadogradnja-demoa/src/main/resources/static/images/hamb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cab5bab75aeef1c6d13197966d73467348563be GIT binary patch literal 7415 zcmbt(bx<2lyKeAe#ieMl;#Svyz}nvJF|PYc!vg%YpH3f0kE(D0Id50xLW~y z01)C6P*G9RP*PFR(9+P+1L^7MX&=$k&@<4}(K7>?8R!{UnRtK<3|x#1^lYN+T)g~3 zLPB(`V$x!QQapk}{8&UpL=QjqFf05oIK z;9#)>uqm)`D6sDO0gU$ov2p$-_5T7F4+{q$o8W%(DLDWO2OAd$9|s>7hXC*1;@+47 zhYc5xQdGsj8lQ^YJv8}A;S>RNeb2@b$5X=;vDY57&%%ltrjKbe<<%^2oLW_RwfyZJgP_$A``>PrjMKmr52 zq7QDWHKi_FdPzd&Y0{0YFl;t%4mw146HOU;hPN>cw~Y zBoz!e{qVa3JogeBsxPw8#$RKjgD}Qe-@1NvcOD%$U2rMA1Mv4%NV7sdpPua1mNSDV z0ZA%kl5%7g;Ti*9{s#N}__&cJ4BvHc+i&kd2|GqrJ32_TZvpxM4AH61rcTo@Gv1iw zxa~&b=QT+VorQaE5o{Ax^vb=a^N7vs`;!-WY2jNyLV@9eY(R;?xb+7Lk8ei{)3g2( z^_=F9Jw#4Q)V)koup#r>|-5)x{fAa)&gBc_{oG+hMl`6TcD&Y91n zYaP#KbY`LWt&{1Pjcnhj)k#~#a>u3ASSoSCAI%$sYO>Ap%~8sGc&<7D$YoB!`dY|t zS(t;oLg>UIRWL2Am!#aAbN2BIsG^xX4LqD$x!DCRwKX&V-mFjb%S5(MoIn~@75EZk z5+}PK`@v28)|dD+8?k`yelpth@tw zq}!ax*ps~z@K*Be-p>1FF>&vFYA5WQS@JX?p=F+(II=zFUhEs6>fkMtU{VdK0w0u2 zS{1-6_bZ#;rNwGj5P1$OibC;~6=ZMuxQ~C*y|jB=k2n{IaN?eubS1WTOlJ`0xHRW# zfj`7uKEM3z^ckEsise@NdjzWqecZxTT$$vd=v?jRgQqs*@CY+-+Prd}E*tSib2jfh z0>_993u=pGMw*^fxFOG{#dN+m0F&@~F?D*MOk;UwS=ay?oWI(2w?Y5^$lNYloSl;YbPFfevC_dYj;~yWFZyHy?lv%e+Abz!?OTUMu zt0OHSbR+-#mv;E z;=~+ZJulFd*GSfcd#HwE{21Y1v#h0aKeT{MK33qL#@qu#%~{)Z zXh3>TLJe;V-+s@Ou(#c$eU_{zCTu|#f)`rvQ?TpR48B|?W!@Uo`WUtoCf?Kmv2NXI z)^{vWLA`aBb*4NwUyhOse^}Xg(2_;vr25n;Ptx-oX2Pk(w<&mUQ z(z;6BU!&C(I^9ov?#J;xtB}`zS_7N#KGdp^#xo1NrrPCdX> zHQqdkE1=(Y!VkKnr_G7fByGMi3dZOLKQ7K;*iDh`KFRuKKN9~neM>uP^-sEgXwPMq zSJSmLp8g1~8|0DJNg0DSX>pGYu}hk;U%vFbU=n^ZzVrl|`U#s^t^$UZXQ49O$+ym ze^0We6u>K!U3$O{7Y`j|528)mQ$TE!vro0=%llPViY5k1_*X9p3~ zhSrXN^O3bL*`?W3Hui_?c7y_uNo0U#tE11*5GahncNs{Q^3hsogm$owG^J@HPp_>) zXOmer>-l*3O4*(fDy(WWpwh`o%DY7~Dhgp)bPjq{1kq~`P#f6C_swD##zMq;a@RV)@3D}tYLhjm)yqXq|n&0%y|LJRP@*2vv)|PJmG_!YSqIat+MF^tc zEyouJ9V1Gh=8G3{*(8izJfk}|_Bu*qVOTbee?xIh^@Z}pdBV;BLZbF@r^n?EP&xfs z9Tu?G&nzdn)I4KnDqw5+yoSWGnasP3Z?}Pdll3FA@5|oCuT%4)%LH0ew7sOIM(^DG zV0#w9sxSm|1{LF7@;b#91x0X~rXBrs z_+j3Yl9(sWl8Iv)4n`7AMLu@^c3c967H};Z7?>1H57NbG30TC^^wG#ZCq#hS!$oFH z4rggAFx1?JhILCIZMojRO47gEPG5O#PaE4CXG7oQa^!CU>GkCj*G4UUh`yps&9z1; z=gO=29>z~~R|wu~(5gdV*q)J6zJ%#O&_6^dEjY0_l9jp$vnOqs7^d8oe6nw7`yT4Z zpD4`Rkc)k%ta3Y?M602PA@%AV0jsJSv`hmn5VdkMA#FTtqvo-UmwYBD9qdr@O_(eM3pjRF`x3LoAGL4c{iMbN0J;y# zX!Ji~LP3YRb~gMZpjq*BIWpEP19=?EE=l*>@`ahDW8Je3r)Y-`;^VHLV^@WOMNE=P zzrSg4J|fQg+BJn~{#X`MVzTgRg5`0nD`Wo&ftTxt18>@DOu4|ObTsT(g~}Zd6jut< zE--|fSz+effmH7GXWJ!rfFEg&GmdK`Z$PSxjHlm!bogw-vH%Vz<|O?T^X!3{Dv<*- zz8M`XA4hTk=q_mDes@v8h|u9Ma9Oz?p1@Ib7B*e#DNFM&|9s$WJN2+n43$Zi zGF5B;=j1FLZ(mk!_%?GooO-g$V|@L!z=Cyu{Kg`HaU+VV^GdwL*0Lt2A zJXb1QuyEQH_F&1Sbh7JJ!oe2Y#K2BucYmvrp7k$j{j6Gl{u9~H+2b~e<&3Kx)1fzN z8t#B^HB43)oz?Y@8XVHm(|Ud1?1cJfavK8aX5L|9;e6G7QiYmr`9~xJs1$$F3z~kr zOE3TUoU@-sTUZ0ITNCa%?cP~uspe=ahEQL|RZ7lO4=dLx`*+P6bP22qX(Zb3AMx$d ztUQ*;$$r|{y*;_~a}zjJROtGyK5NLqR^Mr#Yy6Dc)o#){YXJd?d`{Vn6?Y3Hw-r~X zeD6_+Y~ZATw(WZP$ko3gO(XKy`ygFFmHUh0ciWE!`SH9b0QUrAZ29K2{X?eLTuqMz zvB@k9=3RfZ$zCcDh)cD|`BkiB&W zijV$YuM&!%AraE4C6rc@x+9W|f;Rh#LS>$P1~v}4Ln7Sa)lKxTd(x`x{}yJ-4XM_d z5^I#JY+8>I>8*EN+Hcw(*`B{yUNDOgCb1V^DG?MJ?W=xKz+?LU;RkIs(2%9&GEA)> zP~*1Lc+~XFL6JCEI*d5_3G-ilpr_^YzLyo|ae+;{uN91&XyzxM)|5YI^SyU03h8vKqB~sF1ZmiC|I=Ce|BTZFzf9e(#7W&TM)5m zPl$CyU=RF?xCV+l0(O+mF1gmtOqJaVW}#F~?iiAQyle)qX+W2I>K!3v!KLQEEsk14 zl2pP-V8h|VC-47wq^gOd#N1)%qrF9oGuGYIle*wc}lnbO;OL;9CM zcHiJQ-Ziy^VJ z&lKPFG_hbRiVi=W`u}pn0Hp%Ho){td&K~m4Rn9Ie`GUUdJ=l@rPE}dGMe#W)zR@`utRM5c@FGWRbfJk)6Ty1%gI&c(5Pn-I;C148A-o8F^FU14#(+ao??d-RAm+LA{qd zmoVKmyw{j)-cz~#bBSCuG*RKO7_IhNQP$J!eZ@3cxf9L_NOVb2jB@7D7o|~mTBJv`^{RbhDF+XQFdeP!QFoE;yU#~niEhR2*reC%$9Sg}sI7OPQt5<_kpT{TP--WN>D1u55%Woj)%j(?4*#5WDKLjR%~=cgC#o?xKF^j7y`m@M-= zeeaU%hvj2}m@AhzOa3%ne1i9(HmgzEpQI9xcKD%nSQcCAq{;GD&*O91i)Mx$)io>T z&pWh`jHW@fWzLZtX+p`dL6g}ovF}&UM2ysuWALkN(5iSe_lDSe6N>F-nk-M>Q;q#o zi~3eZ%}fxsKi*4FBW%-phB3ZWzG$?FhQ)yZd?Zf~{OZb>0OXN?QhZD$7w{>t>3O$2 zV`XF)Tj}#%BF6=TKOdFf{7ObJ_@UUy`g6yKAp&x=tsY~*1dU%A#Ealr+p4;@^G?Z^ z#G;lL$Cs>>$cPP5DnNnp${m2{Cr|m93Nl9G!LHgzf@=$#i958khjIrrIn)t$VZ6<`X@xI!!@inOk)QaB2%o3>6D9^YS;e=JG*1WUU8 z`U^bDq;RL|%%={w6a@!#%rqW_P|Dw!YG$EnpgUyr`a5TpLyqpdwd}T znWTR;Y|{LhQnw5cj4N%)5P~*e-T}Vx`05>3YLpGibV>Io8q&!*P+EgT-NV&a5*FIv z@{!IBjpdPmOslJ;uQR1v}$;{Hi`V8V9G}0Gz>evi6mq`zP2w&Y+jy5hieglVgJP_-B{2OzhX#*%; ztuy9Ki8;1odc0bt-mIusY#M{zVFD7GBSKo~+QJXZ3a7dg5*S%Whtt~yZO0VkT%Bvr zKn@MmxinZ66Y#8-g#x?`RT^jTZXnlIDj;3r!Ve6+xH%s7Vzsk?1UYoe(e zKDx)%k7@IF4l?r51dm$xHHr4rFh$+aSa38Tn%+so{hqt38p)EHvmsR`t_8ZKTJK{= zLfBo2X>4MKH#w`AG;tBJmHyexyi_JBWD(|m@--b>*8=o%3v_Zi2f{!bHzOLkPxI>T2kRQuo{K;~VAp4g>%q#}UG(*&m6JPGMD#Lv5+{veDRDqDIr*%m*rMKL{ znX!@E_aX^7y__-A*Fe`{4{+&7e2Q)r=!N_l>L|Q2-*@U5?Xt?@y;Lmq^X@0=7hUW3 zRi;xoEoGQhRKJ>WV0K%{3v$H8vxpN{wy2Th3}z{G2)>ruJ%h+~tM7H_coA~) zJq)7-JI)6UOIbuU*B^Pj{GF$N!mHwh{U(PLWnO(*b>4446?HxnK1#$mAB?N>>VLm<3Bl!W6BP5R6Ai%fwlgak8DZz=EBfcB!AV11 zR8&JWAwMB8Ptqs9={kq-1L~)OLVe5}(qUAJnrNntXNJo=O+X^3_f4z~bRV zZt3868`efM4zpx)bT{S(me{$C+4rOtJ*TTCaZ(isbu-iuoKhwSJpHE=?7i&ly(7K6`cV`V*!Mn$^Aq#@CjOcE;OaBEy^5}g4 literal 0 HcmV?d00001 diff --git a/Nadogradnja-demoa/src/main/resources/static/images/sdasd.jpg b/Nadogradnja-demoa/src/main/resources/static/images/sdasd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f424f425d7637476cffcbb8dfbbfc3d31cd543e6 GIT binary patch literal 140083 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

?5F<^th7zzeX2kF$iCZ(m8 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 literal 0 HcmV?d00001 diff --git a/Nadogradnja-demoa/src/main/resources/static/images13/hamb.jpg b/Nadogradnja-demoa/src/main/resources/static/images13/hamb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cab5bab75aeef1c6d13197966d73467348563be GIT binary patch literal 7415 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 literal 0 HcmV?d00001 From d12dcb9d09ebb5427abee408cd6aa017a69b8212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 26 May 2022 10:41:50 +0200 Subject: [PATCH 12/27] Porudzbina - Menjanje statusa -Dodali smo mogucnost da menadzer promeni status porudzbine iz "Obrada" u "UPpripremi" i onda iz tog stanja u "CekaDostavljaca". -Dodali smo mogucnost da dostavljac promeni status porudzbine iz "CekaDostavljaca" u "UTransportu" i onda iz tog stanja u "Dostavljena". -Kada dostavljac preuzme porudzbinu samo on moze da promeni njen satus u Dostavljena. -Kada porudzbina bude dostavaljena kupac ce dobiti svoj broj bodova. -Dodali smo da se pri registraciji kupca njemu dodaje korpa(prazna porudzbina u statusu "USastavljanju") -Zbog toga smo obrisali endpoint kreiraj-porudzbinu i napravili novi izaberi-restoran koji radi koji ce u listi porudzbina kupca pronaci onu u statusu "U sastavljanu" i njoj dodati ostale parametre. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../configuration/DatabaseConfiguration.java | 2 +- .../controller/PorudzbinaRestController.java | 46 ++++++++-- .../controller/RestoranRestController.java | 1 + .../src/main/java/vezbe/demo/model/Kupac.java | 34 +++++++- .../java/vezbe/demo/model/Porudzbina.java | 3 +- .../java/vezbe/demo/service/KupacService.java | 5 ++ .../vezbe/demo/service/PorudzbinaService.java | 85 +++++++++++++++++-- .../vezbe/demo/service/RestoranService.java | 24 ------ 8 files changed, 159 insertions(+), 41 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index 817078b..6eedb53 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -187,7 +187,7 @@ public boolean instantiate(){ porudzbina2.setDatumIVreme(date1); porudzbina2.setCena(10000); porudzbina2.setKupac(kupac2); - porudzbina2.setStatus(StatusPorudzbine.UPripremi); + porudzbina2.setStatus(StatusPorudzbine.Obrada); porudzbinaRepository.save(porudzbina2); kupacRepository.save(kupac2); kupac2.getListaPorudzbina().add(porudzbina2); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 0841822..488325a 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -50,8 +50,8 @@ public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSessi return ResponseEntity.ok(porudzbinaService.findCekaDostavljaca()); } - @PostMapping("/api/kreiraj-porudzbinu") - public ResponseEntity kreirajPorudzbinu(@RequestBody RestoranImeDto restoranImeDto, HttpSession session){ + @PostMapping("/api/izaberi-restoran") + public ResponseEntity izaberRestoran(@RequestBody RestoranImeDto restoranImeDto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); @@ -78,7 +78,7 @@ public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, Ht } Kupac kupac =(Kupac) loggedKorisnik; - Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); return ResponseEntity.ok(porudzbinaService.kreirajStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); @@ -95,7 +95,7 @@ public ResponseEntity ukloniIzKorpe(@RequestBody KorpaDto korpaDto, } Kupac kupac =(Kupac) loggedKorisnik; - Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); return ResponseEntity.ok(porudzbinaService.ukloniStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); @@ -110,7 +110,7 @@ public ResponseEntity poruci( HttpSession session) { return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); } Kupac kupac =(Kupac) loggedKorisnik; - Porudzbina porudzbina = porudzbinaService.findByStatusAndKupac(kupac); + Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); porudzbinaService.checkIfEmpty(porudzbina); if(porudzbina.getPoruceniArtikli().isEmpty()){ return new ResponseEntity("Porudzbina je prazna", HttpStatus.BAD_REQUEST); @@ -119,7 +119,43 @@ public ResponseEntity poruci( HttpSession session) { } } + @PutMapping("/api/menadezer/promeni-status/{id}") + public ResponseEntity uPripremi(@PathVariable(name = "id") String id, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + + Menadzer menadzer = (Menadzer) loggedKorisnik; + Porudzbina porudzbina = porudzbinaService.promeniStatusMenadzer(menadzer.getRestoran(), id); + + + return ResponseEntity.ok(porudzbina); + } + @PutMapping("/api/dostavljac/promeni-status/{id}") + public ResponseEntity uTransportu(@PathVariable(name = "id") String id, HttpSession session){ + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null){ + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if(loggedKorisnik.getUloga()!= Uloga.Dostavljac){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + + Dostavljac dostavljac = (Dostavljac) loggedKorisnik; + Porudzbina porudzbina = porudzbinaService.promeniStatusDostavljac(dostavljac,id); + if(porudzbina==null){ + return new ResponseEntity("Nemate pristup ovoj porudzbini", HttpStatus.BAD_REQUEST); + } + + + return ResponseEntity.ok(porudzbina); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 0a76297..cc8f182 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -112,4 +112,5 @@ public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dt + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index 9544657..4a7d89e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -20,7 +20,28 @@ public class Kupac extends Korisnik implements Serializable { public Kupac(String korisnickoIme, String lozinka, String ime, String prezime, Pol pol, Date datumRodjenja, Set listaPorudzbina, int bodovi, TipKupca tipKupca) { super(korisnickoIme, lozinka, ime, prezime, pol, datumRodjenja, Uloga.Kupac); - this.listaPorudzbina = listaPorudzbina; + Porudzbina porudzbina = new Porudzbina(); + boolean sadrziKorpu = false; + porudzbina.setKupac(Kupac.this); + porudzbina.setStatusPorudzbine(StatusPorudzbine.USastavljanu); + Set noviSetPorudzbina = new HashSet<>(); + if(listaPorudzbina==null){ + noviSetPorudzbina.add(porudzbina); + this.listaPorudzbina = noviSetPorudzbina; + }else{ + for(Porudzbina p: listaPorudzbina){ + if(p.getStatus().equals(StatusPorudzbine.USastavljanu)){ + sadrziKorpu = true; + break; + } + } + if(sadrziKorpu){ + this.listaPorudzbina = listaPorudzbina; + }else{ + listaPorudzbina.add(porudzbina); + this.listaPorudzbina = listaPorudzbina; + } + } this.bodovi = bodovi; this.tipKupca =tipKupca ; } @@ -29,10 +50,19 @@ public Kupac(String korisnickoIme, String lozinka, String ime, String prezime, P super(korisnickoIme, lozinka, ime, prezime, pol,datumRodjenja, Uloga.Kupac); this.bodovi = 0; this.tipKupca = null; + Porudzbina porudzbina = new Porudzbina(); + porudzbina.setKupac(Kupac.this); + porudzbina.setStatusPorudzbine(StatusPorudzbine.USastavljanu); + this.listaPorudzbina.add(porudzbina); + + } public Kupac() { - + Porudzbina porudzbina = new Porudzbina(); + porudzbina.setKupac(Kupac.this); + porudzbina.setStatusPorudzbine(StatusPorudzbine.USastavljanu); + this.getListaPorudzbina().add(porudzbina); } public int getBodovi() { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java index 48c1a30..992c922 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.repository.cdi.Eager; import javax.persistence.*; import java.io.Serializable; @@ -21,7 +22,7 @@ public class Porudzbina implements Serializable { @GeneratedValue( strategy = GenerationType.AUTO) private UUID id; - @OneToMany //ManyToMany nova klasa stavka pordurdzbine artikal i kolicina polja + @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "porudzbina_id") private Set poruceniArtikli = new HashSet<>(); @ManyToOne diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index 2fd5de3..9b32ffb 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -42,5 +42,10 @@ public void updateKupac(Kupac kupac, Porudzbina porudzbina){ kupac.getListaPorudzbina().add(porudzbina); kupacRepository.save(kupac); } + public void dodajBodove(double cena, Kupac kupac){ + double noviBodovi = cena/1000 * 133; + kupac.setBodovi((int) (kupac.getBodovi() + noviBodovi)); + kupacRepository.save(kupac); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index 5c6f5be..93bf7f9 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -1,13 +1,9 @@ package vezbe.demo.service; -import jdk.jshell.Snippet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import vezbe.demo.model.*; -import vezbe.demo.repository.KupacRepository; import vezbe.demo.repository.PorudzbinaRepository; - -import java.text.SimpleDateFormat; import java.util.*; @Service @@ -24,6 +20,9 @@ public class PorudzbinaService { @Autowired KupacService kupacService; + @Autowired + DostavljacService dostavljacService; + public List getListaPorudzbina(Restoran restoran) { List listaPorudzbina = new ArrayList<>(); @@ -56,12 +55,25 @@ public void dodajStavku(StavkaPorudzbine stavkaPorudzbine, Porudzbina porudzbina porudzbina.setPoruceniArtikli(lista); porudzbinaRepository.save(porudzbina); } - public void makePorudzbina(Kupac kupac, String restoran){//TREBA FORMATIRATI OVE DATUME KAD ZAVRSIS - Restoran restoran1 = restoranService.findByRestoranIme(restoran); + public void makePorudzbina(Kupac kupac, String restoranName){//TREBA FORMATIRATI OVE DATUME KAD ZAVRSIS + Restoran restoran = restoranService.findByRestoranIme(restoranName); // Date date= null; // date = new Date("yyyy/dd/MM"); - Porudzbina porudzbina = new Porudzbina(kupac, restoran1, StatusPorudzbine.USastavljanu, new Date()); + // Porudzbina porudzbina = new Porudzbina(kupac, restoran1, StatusPorudzbine.USastavljanu, new Date()); + Porudzbina porudzbina = null; + for(Porudzbina porudzbina1: porudzbinaRepository.findAll()){ + if(porudzbina1.getKupac().getId().equals(kupac.getId())){ + for(Porudzbina p: kupac.getListaPorudzbina()){ + if(p.getStatusPorudzbine().equals(StatusPorudzbine.USastavljanu)){ + porudzbina = p; + porudzbina.setRestoran(restoran); + porudzbina.setDatumIVreme(new Date()); + } + } + } + } porudzbinaRepository.save(porudzbina); + restoranService.save(restoran); kupacService.updateKupac(kupac, porudzbina); } @@ -83,7 +95,7 @@ public Porudzbina findByStatus(){ } return p; } - public Porudzbina findByStatusAndKupac(Kupac kupac){ + public Porudzbina findPorduzbinaUSastavljanju(Kupac kupac){ Porudzbina p= null; for(Porudzbina porudzbina: kupac.getListaPorudzbina()){ if(porudzbina.getStatus().equals(StatusPorudzbine.USastavljanu)){ @@ -143,5 +155,62 @@ public void checkIfEmpty(Porudzbina porudzbina){ porudzbinaRepository.save(porudzbina); } } + public Porudzbina promeniStatusMenadzer(Restoran restoran, String ID){ + Porudzbina p= null; + List listaPorudzbina = new ArrayList<>(); + listaPorudzbina = porudzbinaRepository.findAll(); + for(Porudzbina porudzbina: listaPorudzbina) { + String result = String.valueOf(porudzbina.getId()); + result = result.replaceAll("[-+.^:,]",""); //UUID daje string sa crticama u njemu koje se ne vide u bazi + + if (result.equals(ID)) { + if (porudzbina.getStatus().equals(StatusPorudzbine.Obrada)) { + p = porudzbina; + p.setStatusPorudzbine(StatusPorudzbine.UPripremi); + porudzbinaRepository.save(p); + restoranService.save(restoran); + return p; + }else if(porudzbina.getStatus().equals(StatusPorudzbine.UPripremi)){ + p = porudzbina; + p.setStatusPorudzbine(StatusPorudzbine.CekaDostavljača); + porudzbinaRepository.save(p); + restoranService.save(restoran); + return p; + } + } + } + return p; + } + public Porudzbina promeniStatusDostavljac(Dostavljac dostavljac, String id){ + List listaPorudzbina = new ArrayList<>(); + Porudzbina p = null; + listaPorudzbina = porudzbinaRepository.findAll(); + for(Porudzbina porudzbina: listaPorudzbina) { + if (porudzbina.getStatus().equals(StatusPorudzbine.CekaDostavljača)) { + p = porudzbina; + p.setStatusPorudzbine(StatusPorudzbine.UTransportu); + porudzbinaRepository.save(p); + dostavljac.getPorudzbineZaDostavu().add(p); + dostavljacService.save(dostavljac); + return p; + } else if (porudzbina.getStatus().equals(StatusPorudzbine.UTransportu)) { + for (Porudzbina porudzbina1 : dostavljacService.findAllById(dostavljac.getId())) { + if (porudzbina1.getId().equals(porudzbina.getId())) { + + p = porudzbina; + p.setStatusPorudzbine(StatusPorudzbine.Dostavljena); + porudzbinaRepository.save(p); + dostavljacService.save(dostavljac); + kupacService.dodajBodove(porudzbina.getCena(), porudzbina.getKupac()); + + return p; + } + } + } + } + return p; + } + + } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index 69a083a..b9848b9 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -100,29 +100,5 @@ public Restoran findByRestoranIme(String naziv) { return r; } - /*public void dodajUPorudzbinu(StavkaPorudzbine stavkaPorudzbine, Porudzbina porudzbina){ - porudzbinaService.dodajStavku(stavkaPorudzbine, porudzbina); - - - } - - public void saveStavkaPorudzbine(StavkaPorudzbine stavkaPorudzbine){ - stavkaPorudzbineService.saveStavka(stavkaPorudzbine); - } - public Artikal findArtikal(String nazivRestorana, String nazivArtikla, int kolicina){ - Artikal a = null; - for(Restoran restoran: restoranRepository.findAll()){ - if(restoran.getNaziv().equals(nazivRestorana)){ - for(Artikal artikal: restoran.getPonuda()){ - if(artikal.getNaziv().equals(nazivArtikla)){ - a = artikal; - } - } - } - } - stavkaPorudzbineService.addArtikal(a,kolicina); - return a; - } - */ } From a34455bd6b36821bc991cf3196209c23671be84f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 26 May 2022 13:47:04 +0200 Subject: [PATCH 13/27] Ispis restorana Dodali smo par RestoranIspisDto i KomentarDto kako bi ispis ove 2 stavke bio kako treba. -Izvrsili male korekcije kod url-ova koji se sastoje od vise reci u svim kontrolerima. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/DostavljacRestController.java | 4 +- .../demo/controller/KupacRestController.java | 2 +- .../controller/LokacijaRestController.java | 2 +- .../controller/MenadzerRestController.java | 6 +- .../controller/RestoranRestController.java | 41 +++++----- .../main/java/vezbe/demo/dto/KomentarDto.java | 40 ++++++++++ .../java/vezbe/demo/dto/RestoranIspisDto.java | 77 +++++++++++++++++++ .../vezbe/demo/service/KomentarService.java | 41 ++++++++++ .../vezbe/demo/service/RestoranService.java | 23 +++++- 9 files changed, 210 insertions(+), 26 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KomentarDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranIspisDto.java create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/service/KomentarService.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java index 3592f57..4d626fd 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java @@ -24,7 +24,7 @@ public class DostavljacRestController { private DostavljacService dostavljacService; - @PostMapping("/api/kreirajDostavljaca") + @PostMapping("/api/kreiraj-dostavljaca") public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto, HttpSession session) throws ParseException { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ @@ -46,7 +46,7 @@ public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dost } - @GetMapping("/api/dostavljac/pregledPorudzbina") + @GetMapping("/api/dostavljac/pregled-porudzbina") public ResponseEntity> pregledPorudzbina(HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 3c33cc1..5dd83e6 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -42,7 +42,7 @@ public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throw return ResponseEntity.ok("Uspesna registracija!"); } - @GetMapping("/api/svePorudzbine") + @GetMapping("/api/sve-porudzbine") public ResponseEntity> sveProduzbine(HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java index 9018fd9..15c95f2 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java @@ -21,7 +21,7 @@ public class LokacijaRestController { @Autowired private LokacijaService lokacijaService; - @PostMapping("/api/kreirajLokaciju") + @PostMapping("/api/kreiraj-lokaciju") public ResponseEntity kreirajLokaciju(@RequestBody LokacijaDto lokacijaDto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java index 418a91e..09f5374 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -22,7 +22,7 @@ public class MenadzerRestController { - @PostMapping("/api/kreirajMenadzera") + @PostMapping("/api/kreiraj-menadzera") public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzerDto, HttpSession session) throws ParseException { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -45,7 +45,7 @@ public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzer return ResponseEntity.ok("Uspesno kreiranje menadzera!"); } - @GetMapping("/api/pregledRestorana") + @GetMapping("/api/pregled-restorana") public ResponseEntity getRestoran(HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -57,7 +57,7 @@ public ResponseEntity getRestoran(HttpSession session){ return ResponseEntity.ok(restoran); } - @DeleteMapping("/api/ukloniArtikal/{id}") + @DeleteMapping("/api/ukloni-artikal/{id}") public ResponseEntity> ukloniArtikal(@PathVariable(name = "id") Long id, HttpSession session){ Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index cc8f182..9057414 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -6,13 +6,8 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.view.RedirectView; -import vezbe.demo.dto.ArtikalDto; -import vezbe.demo.dto.KorpaDto; -import vezbe.demo.dto.NoviMenadzerDto; -import vezbe.demo.dto.RestoranDto; +import vezbe.demo.dto.*; import vezbe.demo.model.*; -import vezbe.demo.service.ArtikalService; import vezbe.demo.service.RestoranService; import javax.servlet.http.HttpSession; @@ -33,7 +28,7 @@ public ResponseEntity> api(){ } - @PostMapping("/api/kreirajRestoran") + @PostMapping("/api/kreiraj-restoran") public ResponseEntity kreirajRestoran(@RequestBody RestoranDto restoranDto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ @@ -49,21 +44,31 @@ public ResponseEntity kreirajRestoran(@RequestBody RestoranDto restoranD return ResponseEntity.ok("Uspesno kreiranje restorana!"); } @GetMapping("/api/{naziv}") - public ResponseEntity getRestoranByNaziv(@PathVariable(name = "naziv") String naziv){ + public ResponseEntity getRestoranByNaziv(@PathVariable(name = "naziv") String naziv){ + Restoran restoran = restoranService.findByName(naziv); + double prosecnaOcena = restoranService.getProsecnaOcena(restoran.getId()); + Set komentari = restoranService.getKomentari(restoran.getId()); + RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); - return ResponseEntity.ok(restoranService.findByName(naziv)); + return ResponseEntity.ok(dto); } - @GetMapping("/api/tipRestorana/{tipRestorana}") - public ResponseEntity> getRestoranByTipRestorana(@PathVariable(name = "tipRestorana") String tipRestorana){ + @GetMapping("/api/tip-restorana/{tipRestorana}") + public ResponseEntity> getRestoraniByTipRestorana(@PathVariable(name = "tipRestorana") String tipRestorana){ + List listaRestorana = restoranService.findByTip(tipRestorana); + List ListaZaIspis = restoranService.SpremiZaIspis(listaRestorana); - return ResponseEntity.ok(restoranService.findByTip(tipRestorana)); + return ResponseEntity.ok(ListaZaIspis); } - @GetMapping("/api/lokacijaRestorana/{lokacija}") - public ResponseEntity getRestoranByLokacija(@PathVariable(name = "lokacija") String lokacija){ - - return ResponseEntity.ok(restoranService.findByLokacija(lokacija)); + @GetMapping("/api/lokacija-restorana/{lokacija}") + public ResponseEntity getRestoranByLokacija(@PathVariable(name = "lokacija") String lokacija){ + Restoran restoran = restoranService.findByLokacija(lokacija); + double prosecnaOcena = restoranService.getProsecnaOcena(restoran.getId()); + Set komentari = restoranService.getKomentari(restoran.getId()); + RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); + + return ResponseEntity.ok(dto); } - @PostMapping("/api/dodajArtikal") + @PostMapping("/api/dodaj-artikal") public ResponseEntity> dodajArtikal( @RequestParam("image") MultipartFile multipartFile,ArtikalDto artikalDto, HttpSession session) throws IOException { Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); @@ -95,7 +100,7 @@ public ResponseEntity> dodajArtikal( @RequestParam("image") Multip } - @PutMapping("/api/restoran/promeniMenadzera") + @PutMapping("/api/restoran/promeni-menadzera") public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KomentarDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KomentarDto.java new file mode 100644 index 0000000..02c6b00 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KomentarDto.java @@ -0,0 +1,40 @@ +package vezbe.demo.dto; + +public class KomentarDto { + private String korisnickoIme; + private String tekst; + private int ocena; + + public KomentarDto() { + } + + public KomentarDto(String korisnickoIme, String tekst, int ocena) { + this.korisnickoIme = korisnickoIme; + this.tekst = tekst; + this.ocena = ocena; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getTekst() { + return tekst; + } + + public void setTekst(String tekst) { + this.tekst = tekst; + } + + public int getOcena() { + return ocena; + } + + public void setOcena(int ocena) { + this.ocena = ocena; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranIspisDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranIspisDto.java new file mode 100644 index 0000000..eef439e --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranIspisDto.java @@ -0,0 +1,77 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.Artikal; +import vezbe.demo.model.Komentar; +import vezbe.demo.model.Lokacija; + +import java.util.List; +import java.util.Set; + +public class RestoranIspisDto { + private String naziv; + private String tip; + private Lokacija lokacija; + private double prosecnaOcena; + private Set komentari; + private Set ponuda; + + public RestoranIspisDto() { + } + + public RestoranIspisDto(String naziv, String tip, Lokacija lokacija, double prosecnaOcena, Set komentari, Set ponuda) { + this.naziv = naziv; + this.tip = tip; + this.lokacija = lokacija; + this.prosecnaOcena = prosecnaOcena; + this.komentari = komentari; + this.ponuda = ponuda; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public String getTip() { + return tip; + } + + public void setTip(String tip) { + this.tip = tip; + } + + public Lokacija getLokacija() { + return lokacija; + } + + public void setLokacija(Lokacija lokacija) { + this.lokacija = lokacija; + } + + public double getProsecnaOcena() { + return prosecnaOcena; + } + + public void setProsecnaOcena(double prosecnaOcena) { + this.prosecnaOcena = prosecnaOcena; + } + + public Set getKomentari() { + return komentari; + } + + public void setKomentari(Set komentari) { + this.komentari = komentari; + } + + public Set getPonuda() { + return ponuda; + } + + public void setPonuda(Set ponuda) { + this.ponuda = ponuda; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KomentarService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KomentarService.java new file mode 100644 index 0000000..30981fb --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KomentarService.java @@ -0,0 +1,41 @@ +package vezbe.demo.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.HashSet; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import vezbe.demo.dto.KomentarDto; +import vezbe.demo.model.Komentar; +import vezbe.demo.model.Restoran; +import vezbe.demo.repository.KomentarRepository; + + +@Service +public class KomentarService { + @Autowired + KomentarRepository komentarRepository; + + public double getProsecnaOcena(Long restoranId) { + double ocena = 0; + for (Komentar komentar : komentarRepository.findAll()) { + if (komentar.getRestoran().getId().equals(restoranId)) { + ocena += komentar.getOcena(); + } + } + return ocena; + } + + public Set getByRestoran(Long restoranId) { + Set komentarList = new HashSet<>(); + for (Komentar komentar : komentarRepository.findAll()) { + if (komentar.getRestoran().getId().equals(restoranId)) { + KomentarDto komentarDto = new KomentarDto(komentar.getKupac().getKorisnickoIme(), komentar.getTekst(), komentar.getOcena()); + komentarList.add(komentarDto); + } + } + return komentarList; + } +} \ No newline at end of file diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index b9848b9..6eaf57a 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -2,7 +2,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import vezbe.demo.dto.KomentarDto; import vezbe.demo.dto.RestoranDto; +import vezbe.demo.dto.RestoranIspisDto; import vezbe.demo.model.*; import vezbe.demo.repository.RestoranRepository; @@ -25,6 +27,10 @@ public class RestoranService { @Autowired private StavkaPorudzbineService stavkaPorudzbineService; + @Autowired + private KomentarService komentarService; + + /* @Autowired private PorudzbinaService porudzbinaService; */ @@ -100,5 +106,20 @@ public Restoran findByRestoranIme(String naziv) { return r; } - + public double getProsecnaOcena(Long restoranId){ + return komentarService.getProsecnaOcena(restoranId); + } + public Set getKomentari(Long restoranId){ + return komentarService.getByRestoran(restoranId); + } + public List SpremiZaIspis(List listaRestorana){ + List ispisLista = new ArrayList<>(); + for(Restoran restoran: listaRestorana){ + double prosecnaOcena = getProsecnaOcena(restoran.getId()); + Set komentari = getKomentari(restoran.getId()); + RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); + ispisLista.add(dto); + } + return ispisLista; + } } From 0bc27798fffd37364fad2910a05eb1afd8d33f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 26 May 2022 14:02:21 +0200 Subject: [PATCH 14/27] ispis osnovnih informacija za restorane Napravili novi dto za ispis naziva, tipa i adrese svih restorana. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/RestoranRestController.java | 4 +- .../vezbe/demo/dto/RestoranBasicInfoDto.java | 43 +++++++++++++++++++ .../vezbe/demo/service/RestoranService.java | 10 +++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranBasicInfoDto.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 9057414..9280b4d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -22,9 +22,9 @@ public class RestoranRestController { @GetMapping("/api") - public ResponseEntity> api(){ + public ResponseEntity> api(){ - return ResponseEntity.ok(restoranService.findAll()); + return ResponseEntity.ok(restoranService.getAllBasicInfo()); } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranBasicInfoDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranBasicInfoDto.java new file mode 100644 index 0000000..fc4e6cc --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranBasicInfoDto.java @@ -0,0 +1,43 @@ +package vezbe.demo.dto; + +import vezbe.demo.model.Lokacija; + +public class RestoranBasicInfoDto { + private String naziv; + private String tip; + private String adresa; + + public RestoranBasicInfoDto() { + + } + + public RestoranBasicInfoDto(String naziv, String tip, String adresa) { + this.naziv = naziv; + this.tip = tip; + this.adresa = adresa; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public String getTip() { + return tip; + } + + public void setTip(String tip) { + this.tip = tip; + } + + public String getAdresa() { + return adresa; + } + + public void setAdresa(String adresa) { + this.adresa = adresa; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index 6eaf57a..a16e682 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import vezbe.demo.dto.KomentarDto; +import vezbe.demo.dto.RestoranBasicInfoDto; import vezbe.demo.dto.RestoranDto; import vezbe.demo.dto.RestoranIspisDto; import vezbe.demo.model.*; @@ -34,6 +35,15 @@ public class RestoranService { /* @Autowired private PorudzbinaService porudzbinaService; */ + public List getAllBasicInfo(){ + List dtoList = new ArrayList<>(); + for(Restoran restoran: restoranRepository.findAll()){ + + RestoranBasicInfoDto dto = new RestoranBasicInfoDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija().getAdresa()); + dtoList.add(dto); + } + return dtoList; + } public Restoran save(Restoran restoran) { return restoranRepository.save(restoran); } From b8946391a2c68acbfad1e13047d1d874da7eb5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 26 May 2022 18:43:58 +0200 Subject: [PATCH 15/27] dodavanje artikla Dodali smo da su sva polja sem opisa i kolicine obavezni. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../demo/controller/RestoranRestController.java | 15 +++++++++++++-- .../main/resources/static/images/null/hamb.jpg | Bin 0 -> 7415 bytes 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/null/hamb.jpg diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 9280b4d..1a034ef 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -69,16 +69,27 @@ public ResponseEntity getRestoranByLokacija(@PathVariable(name return ResponseEntity.ok(dto); } @PostMapping("/api/dodaj-artikal") - public ResponseEntity> dodajArtikal( @RequestParam("image") MultipartFile multipartFile,ArtikalDto artikalDto, HttpSession session) throws IOException { + public ResponseEntity> dodajArtikal(@RequestParam("image") MultipartFile multipartFile,ArtikalDto artikalDto, HttpSession session) throws IOException { Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); if(loggedKorisnik.getRestoran()== null){ return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); } - if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } + if(artikalDto.getNaziv().isEmpty()){ + return new ResponseEntity("Polje naziv je obavezno!", HttpStatus.BAD_REQUEST); + } + if(artikalDto.getTipArtikla().isEmpty()){ + return new ResponseEntity("Polje tipArtikla je obavezno!", HttpStatus.BAD_REQUEST); + } + if(artikalDto.getCena() == 0){ + return new ResponseEntity("Polje cena je obavezno!", HttpStatus.BAD_REQUEST); + } + if(multipartFile.isEmpty()){ + return new ResponseEntity("Polje slika je obavezno!", HttpStatus.BAD_REQUEST); + } TipArtikla tipArtikla = TipArtikla.valueOf(artikalDto.getTipArtikla()); Artikal artikal = new Artikal(artikalDto.getNaziv(), artikalDto.getCena(), tipArtikla); diff --git a/Nadogradnja-demoa/src/main/resources/static/images/null/hamb.jpg b/Nadogradnja-demoa/src/main/resources/static/images/null/hamb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cab5bab75aeef1c6d13197966d73467348563be GIT binary patch literal 7415 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 literal 0 HcmV?d00001 From 2cd49437fc1d61328d787b41be644a6eea3d30f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Thu, 26 May 2022 21:35:29 +0200 Subject: [PATCH 16/27] Menjanje statusa porudzbine Dodali smo menjanje statusa porudzbine u obrada i nakon togaa automatsko kreiranje nove liste u statusu USasatavljanju za tog kupca Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../src/main/java/vezbe/demo/model/Porudzbina.java | 7 +++++++ .../main/java/vezbe/demo/service/PorudzbinaService.java | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java index 992c922..012fc42 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Porudzbina.java @@ -47,6 +47,13 @@ public UUID getUUID() { public Porudzbina() { this.cena = 0; } + public Porudzbina(StatusPorudzbine statusPorudzbine, Kupac kupac) + { + this.cena = 0; + this.statusPorudzbine = statusPorudzbine; + this.kupac = kupac; + } + public Porudzbina( Set poruceniArtikli, Restoran restoran, Date datumIVreme, long cena, Kupac kupac, StatusPorudzbine statusPorudzbine) { this.poruceniArtikli = poruceniArtikli; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index 93bf7f9..de6add7 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -148,11 +148,13 @@ public Porudzbina ukloniStavkuPorudzbine(String naziv, int kolicina, Porudzbina return porudzbina; } public void checkIfEmpty(Porudzbina porudzbina){ - if(porudzbina.getPoruceniArtikli().isEmpty()){ - porudzbinaRepository.delete(porudzbina); - }else{ + Kupac kupac = porudzbina.getKupac(); + if(!porudzbina.getPoruceniArtikli().isEmpty()){ porudzbina.setStatusPorudzbine(StatusPorudzbine.Obrada); + Porudzbina porudzbina1 = new Porudzbina(StatusPorudzbine.USastavljanu, kupac); + kupac.getListaPorudzbina().add(porudzbina1); porudzbinaRepository.save(porudzbina); + kupacService.save(kupac); } } public Porudzbina promeniStatusMenadzer(Restoran restoran, String ID){ From c8f5723549d7877ea74b6a1f61d2bf07df5c9527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Tue, 21 Jun 2022 13:15:53 +0200 Subject: [PATCH 17/27] Kreiranje restorana i sve porudzbine kupca Spojili smo kreiranje restorana i lokacije u jedan endoint(menadzer) i ispravili pregled svojih porudzbina(kupac) --- .idea/misc.xml | 4 ++ .../controller/LokacijaRestController.java | 26 ------------ .../controller/PorudzbinaRestController.java | 6 +-- .../controller/RestoranRestController.java | 16 +++++++- .../main/java/vezbe/demo/dto/LokacijaDto.java | 41 ------------------- .../main/java/vezbe/demo/dto/RestoranDto.java | 33 ++++++++++++++- .../src/main/java/vezbe/demo/model/Kupac.java | 2 +- .../java/vezbe/demo/service/KupacService.java | 12 +++--- .../vezbe/demo/service/RestoranService.java | 4 ++ .../src/main/resources/application.properties | 3 +- 10 files changed, 66 insertions(+), 81 deletions(-) create mode 100644 .idea/misc.xml delete mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c4d21e5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java index 15c95f2..ab31feb 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/LokacijaRestController.java @@ -1,40 +1,14 @@ package vezbe.demo.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import vezbe.demo.dto.LokacijaDto; -import vezbe.demo.dto.RestoranDto; -import vezbe.demo.model.Korisnik; -import vezbe.demo.model.Lokacija; -import vezbe.demo.model.Restoran; -import vezbe.demo.model.Uloga; import vezbe.demo.service.LokacijaService; -import javax.servlet.http.HttpSession; - @RestController public class LokacijaRestController { @Autowired private LokacijaService lokacijaService; - @PostMapping("/api/kreiraj-lokaciju") - public ResponseEntity kreirajLokaciju(@RequestBody LokacijaDto lokacijaDto, HttpSession session){ - Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ - return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); - } - if(loggedKorisnik.getUloga()!= Uloga.Admin){ - return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); - } - - Lokacija lokacija = new Lokacija(lokacijaDto.getGeoDuzina(), lokacijaDto.getGeoSirina(), lokacijaDto.getAdresa()); - this.lokacijaService.save(lokacija); - return ResponseEntity.ok("Uspesno kreiranje lokacije!"); - } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 488325a..ecbfbab 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -4,10 +4,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import vezbe.demo.dto.LokacijaDto; import vezbe.demo.dto.RestoranImeDto; import vezbe.demo.model.*; -import vezbe.demo.service.MenadzerService; import vezbe.demo.service.PorudzbinaService; import vezbe.demo.dto.KorpaDto; @@ -37,7 +35,7 @@ public ResponseEntity> getPorudzbine(HttpSession session) { } - @GetMapping("/api/dostavljac/cekaDostavljaca") + @GetMapping("/api/dostavljac/ceka-dostavljaca") public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSession session) { List listaPorudzbina = new ArrayList<>(); Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -119,7 +117,7 @@ public ResponseEntity poruci( HttpSession session) { } } - @PutMapping("/api/menadezer/promeni-status/{id}") + @PutMapping("/api/menadezer/promeni-status/{id}")//GRESKA U KUCANJU public ResponseEntity uPripremi(@PathVariable(name = "id") String id, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 1a034ef..e67fb1d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @@ -15,13 +16,22 @@ import java.util.*; @RestController +@CrossOrigin("http://localhost:8080") +@RequestMapping(value = "/api/") public class RestoranRestController { + private final RestoranService restoranService; + @Autowired - private RestoranService restoranService; + public RestoranRestController(RestoranService restoranService) { + this.restoranService = restoranService; + } - @GetMapping("/api") + @GetMapping( + value = "/restorani", + produces = MediaType.APPLICATION_JSON_VALUE + ) public ResponseEntity> api(){ return ResponseEntity.ok(restoranService.getAllBasicInfo()); @@ -39,6 +49,8 @@ public ResponseEntity kreirajRestoran(@RequestBody RestoranDto restoranD } Restoran restoran = new Restoran(restoranDto.getNaziv(), restoranDto.getTipRestorana()); + Lokacija lokacija = new Lokacija(restoranDto.getGeoSirina(), restoranDto.getGeoDuzina(), restoranDto.getAdresa()); + restoran.setLokacija(lokacija); this.restoranService.save(restoran); return ResponseEntity.ok("Uspesno kreiranje restorana!"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java deleted file mode 100644 index 825f0da..0000000 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LokacijaDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package vezbe.demo.dto; - -public class LokacijaDto { - private double geoDuzina; - private double geoSirina; - private String adresa; - - - public double getGeoDuzina() { - return geoDuzina; - } - - public void setGeoDuzina(double geoDuzina) { - this.geoDuzina = geoDuzina; - } - - public double getGeoSirina() { - return geoSirina; - } - - public void setGeoSirina(double geoSirina) { - this.geoSirina = geoSirina; - } - - public String getAdresa() { - return adresa; - } - - public void setAdresa(String adresa) { - this.adresa = adresa; - } - - public LokacijaDto() { - } - - public LokacijaDto(double geoDuzina, double geoSirina, String adresa) { - this.geoDuzina = geoDuzina; - this.geoSirina = geoSirina; - this.adresa = adresa; - } -} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java index df73fb5..15bc83e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranDto.java @@ -4,13 +4,44 @@ public class RestoranDto { private String naziv; private String tipRestorana; + private double geoDuzina; + private double geoSirina; + private String adresa; public RestoranDto() { } - public RestoranDto(String naziv, String tipRestorana) { + + public double getGeoDuzina() { + return geoDuzina; + } + + public void setGeoDuzina(double geoDuzina) { + this.geoDuzina = geoDuzina; + } + + public double getGeoSirina() { + return geoSirina; + } + + public void setGeoSirina(double geoSirina) { + this.geoSirina = geoSirina; + } + + public String getAdresa() { + return adresa; + } + + public void setAdresa(String adresa) { + this.adresa = adresa; + } + + public RestoranDto(String naziv, String tipRestorana, double geoDuzina, double geoSirina, String adresa) { this.naziv = naziv; this.tipRestorana = tipRestorana; + this.geoDuzina = geoDuzina; + this.geoSirina = geoSirina; + this.adresa = adresa; } public String getNaziv() { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java index 4a7d89e..b63ee74 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/model/Kupac.java @@ -62,7 +62,7 @@ public Kupac() { Porudzbina porudzbina = new Porudzbina(); porudzbina.setKupac(Kupac.this); porudzbina.setStatusPorudzbine(StatusPorudzbine.USastavljanu); - this.getListaPorudzbina().add(porudzbina); + this.listaPorudzbina.add(porudzbina); } public int getBodovi() { diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index 9b32ffb..a10b7e9 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -17,11 +17,13 @@ public class KupacService { private KupacRepository kupacRepository; public Kupac findOne(Long id){ - Optional foundKupac = kupacRepository.findById(id); - if (foundKupac.isPresent()) - return foundKupac.get(); - - return null; + Kupac k = null; + for(Kupac kupac: kupacRepository.findAll()){ + if(kupac.getId().equals(id)){ + k = kupac; + } + } + return k; } public List findAll(){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index a16e682..4848ac5 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -31,6 +31,9 @@ public class RestoranService { @Autowired private KomentarService komentarService; + @Autowired + private LokacijaService lokacijaService; + /* @Autowired private PorudzbinaService porudzbinaService; @@ -45,6 +48,7 @@ public List getAllBasicInfo(){ return dtoList; } public Restoran save(Restoran restoran) { + lokacijaService.save(restoran.getLokacija()); return restoranRepository.save(restoran); } diff --git a/Nadogradnja-demoa/src/main/resources/application.properties b/Nadogradnja-demoa/src/main/resources/application.properties index 2213761..03cbd8c 100644 --- a/Nadogradnja-demoa/src/main/resources/application.properties +++ b/Nadogradnja-demoa/src/main/resources/application.properties @@ -4,6 +4,7 @@ spring.h2.console.enabled=true spring.h2.console.path=/h2 +server.port=8081 # Spring DataSource spring.datasource.url=jdbc:h2:file:~/test @@ -18,4 +19,4 @@ spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false - +hibernate.jdbc.lob.non_contextual_creation=true From 78df1c620377430ad29c5ad22f3fb0bb4181bfb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Tue, 21 Jun 2022 14:20:49 +0200 Subject: [PATCH 18/27] Pretraga restorana Dodali smo prikaz restorana po njegovom id-u, ako i pretragu restorana po svim parametrima u jednom endopoint-u. Obrisali smo razlicite metode pretrage po razlicitim parametrima. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/RestoranRestController.java | 28 +++++------- .../vezbe/demo/dto/RestoranPretragaDto.java | 40 +++++++++++++++++ .../vezbe/demo/service/RestoranService.java | 43 ++++++++++++++++--- 3 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranPretragaDto.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index e67fb1d..51e371e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -55,31 +55,23 @@ public ResponseEntity kreirajRestoran(@RequestBody RestoranDto restoranD return ResponseEntity.ok("Uspesno kreiranje restorana!"); } - @GetMapping("/api/{naziv}") - public ResponseEntity getRestoranByNaziv(@PathVariable(name = "naziv") String naziv){ - Restoran restoran = restoranService.findByName(naziv); - double prosecnaOcena = restoranService.getProsecnaOcena(restoran.getId()); - Set komentari = restoranService.getKomentari(restoran.getId()); - RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); + + @GetMapping("/pretraga") + public ResponseEntity> pretragaRestorana(@RequestBody String input){ + Set restorani = restoranService.pronadjiRestorane(input); + return ResponseEntity.ok(restorani); - return ResponseEntity.ok(dto); } - @GetMapping("/api/tip-restorana/{tipRestorana}") - public ResponseEntity> getRestoraniByTipRestorana(@PathVariable(name = "tipRestorana") String tipRestorana){ - List listaRestorana = restoranService.findByTip(tipRestorana); - List ListaZaIspis = restoranService.SpremiZaIspis(listaRestorana); - return ResponseEntity.ok(ListaZaIspis); - } - @GetMapping("/api/lokacija-restorana/{lokacija}") - public ResponseEntity getRestoranByLokacija(@PathVariable(name = "lokacija") String lokacija){ - Restoran restoran = restoranService.findByLokacija(lokacija); + @GetMapping("/restorani/{id}") + public ResponseEntity prikazJednogRestorana(@PathVariable(name = "id") Long id){ + Restoran restoran = restoranService.findById(id); double prosecnaOcena = restoranService.getProsecnaOcena(restoran.getId()); Set komentari = restoranService.getKomentari(restoran.getId()); - RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); - return ResponseEntity.ok(dto); + return ResponseEntity.ok(restoranService.spremiZaIspis(restoran, prosecnaOcena, komentari)) ; } + @PostMapping("/api/dodaj-artikal") public ResponseEntity> dodajArtikal(@RequestParam("image") MultipartFile multipartFile,ArtikalDto artikalDto, HttpSession session) throws IOException { Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranPretragaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranPretragaDto.java new file mode 100644 index 0000000..e9a36d1 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/RestoranPretragaDto.java @@ -0,0 +1,40 @@ +package vezbe.demo.dto; + +public class RestoranPretragaDto { + private String naziv; + private String tip; + private String adresa; + + public RestoranPretragaDto() { + } + + public RestoranPretragaDto(String naziv, String tip, String adresa) { + this.naziv = naziv; + this.tip = tip; + this.adresa = adresa; + } + + public String getNaziv() { + return naziv; + } + + public void setNaziv(String naziv) { + this.naziv = naziv; + } + + public String getTip() { + return tip; + } + + public void setTip(String tip) { + this.tip = tip; + } + + public String getAdresa() { + return adresa; + } + + public void setAdresa(String adresa) { + this.adresa = adresa; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index 4848ac5..bf3a330 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -4,15 +4,12 @@ import org.springframework.stereotype.Service; import vezbe.demo.dto.KomentarDto; import vezbe.demo.dto.RestoranBasicInfoDto; -import vezbe.demo.dto.RestoranDto; import vezbe.demo.dto.RestoranIspisDto; +import vezbe.demo.dto.RestoranPretragaDto; import vezbe.demo.model.*; import vezbe.demo.repository.RestoranRepository; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; @Service public class RestoranService { @@ -55,8 +52,21 @@ public Restoran save(Restoran restoran) { public List findAll() { return restoranRepository.findAll(); } + public RestoranIspisDto spremiZaIspis(Restoran restoran, double prosecnaOcena, Set komentari){ + RestoranIspisDto dto = new RestoranIspisDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija(), prosecnaOcena, komentari, restoran.getPonuda()); + return dto; + } + + public Restoran findById(Long id){ + Restoran r= null; + for(Restoran restoran: restoranRepository.findAll()){ + if(restoran.getId().equals(id)){ + r = restoran; + } + } + return r; + } - ; public Restoran findByName(String naziv) { Restoran r = null; @@ -136,4 +146,25 @@ public List SpremiZaIspis(List listaRestorana){ } return ispisLista; } + public Set pronadjiRestorane(String input){ + Set lista = new HashSet<>(); + for(Restoran restoran: restoranRepository.findAll()){ + if(input.contains(restoran.getNaziv())){ + RestoranPretragaDto dto = new RestoranPretragaDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija().getAdresa()); + lista.add(dto); + continue; + } + if(input.contains(restoran.getTipRestorana())){ + RestoranPretragaDto dto = new RestoranPretragaDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija().getAdresa()); + lista.add(dto); + continue; + } + if(input.contains(restoran.getLokacija().getAdresa())){ + RestoranPretragaDto dto = new RestoranPretragaDto(restoran.getNaziv(), restoran.getTipRestorana(), restoran.getLokacija().getAdresa()); + lista.add(dto); + continue; + } + } + return lista; + } } From 555f36e921ecc0f12c5fba701a2941d09cc944d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Tue, 21 Jun 2022 16:01:10 +0200 Subject: [PATCH 19/27] Brisanje i menjanje artikala Dodali smo funkcionalnosti: (Menadzer) -uklanjanje artikala (samo iz ponude restorana) -izmena artikala Za oba endointa smo dodali proveru da li je artikal u ponudi njihovog restorana, ako nije vracamo HttpStatus.BAD_REQUEST Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/MenadzerRestController.java | 17 ------- .../controller/RestoranRestController.java | 41 ++++++++++++++++ .../vezbe/demo/service/ArtikalService.java | 13 +++++ .../vezbe/demo/service/MenadzerService.java | 16 +------ .../vezbe/demo/service/RestoranService.java | 48 +++++++++++++++++-- 5 files changed, 99 insertions(+), 36 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java index 09f5374..4183d22 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -57,22 +57,5 @@ public ResponseEntity getRestoran(HttpSession session){ return ResponseEntity.ok(restoran); } - @DeleteMapping("/api/ukloni-artikal/{id}") - public ResponseEntity> ukloniArtikal(@PathVariable(name = "id") Long id, HttpSession session){ - Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); - - if(loggedKorisnik.getRestoran()== null){ - return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); - } - - if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ - return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); - } - - - - List l = menadzerService.removeArtikal(id, loggedKorisnik.getRestoran()); - return ResponseEntity.ok(l); - } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index 51e371e..b8e5628 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -129,6 +129,47 @@ public ResponseEntity promeniMenadzera(@RequestBody NoviMenadzerDto dt return ResponseEntity.ok(menadzer); } + @DeleteMapping("/ukloni-artikal/{id}") + public ResponseEntity> ukloniArtikal(@PathVariable(name = "id") Long id, HttpSession session){ + Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); + + if(loggedKorisnik.getRestoran()== null){ + return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); + } + + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + if(!restoranService.pronadjiArtikal(id, loggedKorisnik.getRestoran())){ + return new ResponseEntity("U vasoj ponudi nema ovog artikla", HttpStatus.BAD_REQUEST); + } + + + + List l = restoranService.removeArtikal(id, loggedKorisnik.getRestoran()); + return ResponseEntity.ok(l); + } + @PutMapping("/api/promeni-artikal/{id}") + public ResponseEntity promeniArtikal(@PathVariable(name = "id") Long id, @RequestBody Artikal artikal, HttpSession session){ + Menadzer loggedKorisnik = (Menadzer) session.getAttribute("logovaniKorsinik"); + + if(loggedKorisnik.getRestoran()== null){ + return new ResponseEntity("ne mozes ovako loggedKorinsik", HttpStatus.BAD_REQUEST); + } + + if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + if(!restoranService.pronadjiArtikal(id, loggedKorisnik.getRestoran())){ + return new ResponseEntity("U vasoj ponudi nema ovog artikla", HttpStatus.BAD_REQUEST); + } + + //SLIKU NISI MENJAOOOOOOOOOOOOOOOOOOOOOOOOO + return ResponseEntity.ok(restoranService.promeniArtikal(artikal, loggedKorisnik.getRestoran(), id)); + + } + + diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java index 1c95824..7ab02ae 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/ArtikalService.java @@ -26,5 +26,18 @@ public Set dodajArtikal(Artikal artikal, Restoran restoran){ } */ return restoran.getPonuda(); + + } + public Artikal findById(Long id){ + Artikal a = null; + for(Artikal artikal: artikalRepository.findAll()){ + if(artikal.getId().equals(id)) { + a = artikal; + } + } + return a; + } + public void save(Artikal artikal){ + artikalRepository.save(artikal); } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java index ff9fac6..7707e37 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/MenadzerService.java @@ -42,21 +42,7 @@ public Restoran findRestoran(Long ID){ } return null; } - public List removeArtikal(Long id, Restoran restoran) { - Artikal a= null; - for(Artikal artikal: restoran.getPonuda()){ - if(artikal.getId().equals(id)){ - a = artikal; - break; - } - } - restoran.getPonuda().remove(a); - List l= new ArrayList<>(); - for(Artikal artikal:restoran.getPonuda()){ - l.add(artikal); - } - return l; - } + public Menadzer postaviNovogMenadzera(String korisnickoIme, Restoran restoran){ Menadzer m = null; for(Menadzer menadzer: menadzerRepository.findAll()){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java index bf3a330..b902a47 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/RestoranService.java @@ -98,9 +98,7 @@ public Restoran findByLokacija(String adresa) { return r; } - public ArtikalService getArtikalService() { - return artikalService; - } + public Set dodajArtikal(Artikal artikal, Restoran restoran) { Set novaLista = new HashSet<>(); @@ -167,4 +165,46 @@ public Set pronadjiRestorane(String input){ } return lista; } -} + public List removeArtikal(Long id, Restoran restoran) { + Artikal a = artikalService.findById(id); + + restoran.getPonuda().remove(a); + restoranRepository.save(restoran); + + List l= new ArrayList<>(); + for(Artikal artikal:restoran.getPonuda()){ + l.add(artikal); + } + return l; + } + public Artikal promeniArtikal(Artikal artikal, Restoran restoran,Long id){ + Artikal stariArtikal = artikalService.findById(id); + if(!artikal.getNaziv().isEmpty()){ + stariArtikal.setNaziv(artikal.getNaziv()); + } + if(artikal.getTipArtikla()!=null){ + stariArtikal.setTipArtikla(artikal.getTipArtikla()); + } + if(artikal.getCena() != 0){ + stariArtikal.setCena(artikal.getCena()); + } + if(artikal.getKolicina()!= 0){ + stariArtikal.setKolicina(artikal.getKolicina()); + } + if(!artikal.getOpis().isEmpty()){ + stariArtikal.setOpis(artikal.getOpis()); + } + artikalService.save(stariArtikal); + restoranRepository.save(restoran); + return stariArtikal; + + } + public Boolean pronadjiArtikal(Long id, Restoran restoran){ + for(Artikal artikal: restoran.getPonuda()){ + if(artikal.getId().equals(id)){ + return true; + } + } + return false; + } + } From 65f08e49ef4eb04a9ddd0dd1973ffdb77ef79f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Fri, 1 Jul 2022 15:27:06 +0200 Subject: [PATCH 20/27] Cors podrska za login Resili smo probleme oko CORS-a. Ostalo je da uradimo redirektovanje u odnosu na uogu ulogovanog korisnika. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../vezbe/demo/configuration/CorsRunner.java | 23 +++++ .../configuration/DatabaseConfiguration.java | 7 +- .../controller/KorisnikRestController.java | 31 ++++-- .../controller/PorudzbinaRestController.java | 13 ++- .../controller/RestoranRestController.java | 13 ++- .../main/java/vezbe/demo/dto/KorisnikDto.java | 94 ++++++++++++++++++ .../src/main/resources/application.properties | 2 + .../resources/static/images/kapricoza.jpg | Bin 0 -> 162320 bytes 8 files changed, 163 insertions(+), 20 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/CorsRunner.java create mode 100644 Nadogradnja-demoa/src/main/resources/static/images/kapricoza.jpg diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/CorsRunner.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/CorsRunner.java new file mode 100644 index 0000000..c1327e8 --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/CorsRunner.java @@ -0,0 +1,23 @@ +package vezbe.demo.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsRunner implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry){ + registry.addMapping("/**") + .allowCredentials(true) + // Which primitive fields to release + .allowedOriginPatterns("*") + .allowedMethods(new String[]{ + "GET", "POST", "PUT", "DELETE"}) + .allowedHeaders("*"); + } + +} + + diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index 6eedb53..ab83f1b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -71,12 +71,13 @@ public boolean instantiate(){ tipKupcaRepository.saveAll(List.of(bronzani, srebrni, zlatni, platinum, dijamant)); - Artikal artikal1 = new Artikal("naziv1", 123, TipArtikla.Jelo, 100, "opis1"); + Artikal artikal1 = new Artikal("pica mala", 250, TipArtikla.Jelo, 100, "pica cipriciossa, 23cm, pelat, sir, šunka, šampinjoni "); + artikal1.setSlika("/src/main/resources/static/images/kapricoza.jpg"); artikalRepository.save(artikal1); - Artikal artikal2 = new Artikal("naziv2", 321, TipArtikla.Pice, 210, "opis2"); + Artikal artikal2 = new Artikal("pica normalna", 520, TipArtikla.Jelo, 210, "pica cipriciossa, 35cm, pelat, sir, šunka, šampinjoni"); artikalRepository.save(artikal2); - Artikal artikal3 = new Artikal("naziv3", 500, TipArtikla.Jelo, 10, "opis3"); + Artikal artikal3 = new Artikal("pica velika", 900, TipArtikla.Jelo, 100, "pica cipriciossa, 50cm, pelat, sir, šunka, šampinjoni"); artikalRepository.save(artikal3); Artikal artikal4 = new Artikal("naziv4", 123, TipArtikla.Pice, 100, "opis4"); artikalRepository.save(artikal4); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index 0a87d0f..fdb45eb 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -3,36 +3,47 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.KorisnikDto; import vezbe.demo.dto.LoginDto; import vezbe.demo.model.*; import vezbe.demo.service.KorisnikService; +import vezbe.demo.service.RestoranService; import javax.servlet.http.HttpSession; import java.util.ArrayList; import java.util.List; @RestController +@RequestMapping(value = "/api/") +@CrossOrigin(origins = "http://localhost:8080") public class KorisnikRestController { + private final KorisnikService korisnikService; + @Autowired - private KorisnikService korisnikService; + public KorisnikRestController(KorisnikService korisnikService) { + this.korisnikService = korisnikService; + } + - @PostMapping("/api/login") - public ResponseEntity login(@RequestBody LoginDto loginDto, HttpSession session){ + @PostMapping( + value="login", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity login(@RequestBody KorisnikDto loginDto, HttpSession session) throws Exception{ if(loginDto.getKorisnickoIme().isEmpty() || loginDto.getLozinka().isEmpty()){ - return new ResponseEntity("Invalid login data", HttpStatus.BAD_REQUEST); + return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK); } Korisnik loggedKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); if (loggedKorisnik == null) - return new ResponseEntity<>("Korisnik ne postoji!", HttpStatus.NOT_FOUND); + return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK); session.setAttribute("logovaniKorsinik", loggedKorisnik); - - Korisnik prijavljeniKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); - - - return ResponseEntity.ok("Uspesno prijavljivanje!"); + KorisnikDto korisnikDto= new KorisnikDto(loggedKorisnik.getKorisnickoIme(), loggedKorisnik.getLozinka(), loggedKorisnik.getIme(), loggedKorisnik.getPrezime(), loggedKorisnik.getDatumRodjenja(), loggedKorisnik.getPol(), loggedKorisnik.getUloga()); + System.out.println(korisnikDto.getUloga()); + return new ResponseEntity<>(korisnikDto, HttpStatus.OK); } @GetMapping("/api/profil") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index ecbfbab..27d7c0c 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.RestoranImeDto; @@ -14,6 +15,8 @@ import java.util.*; @RestController +@CrossOrigin("http://localhost:8080") +@RequestMapping(value = "/api/") public class PorudzbinaRestController { @Autowired @@ -64,7 +67,10 @@ public ResponseEntity izaberRestoran(@RequestBody RestoranImeDto res return ResponseEntity.ok(porudzbinaService.getAll()); } - @PostMapping("/api/dodaj-u-korpu") + @PostMapping( + value="dodaj-u-korpu", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -78,7 +84,8 @@ public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, Ht Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); - return ResponseEntity.ok(porudzbinaService.kreirajStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); + return new ResponseEntity<>(porudzbinaService.kreirajStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina), HttpStatus.OK); + } @PostMapping("/api/ukloni-iz-korpe") @@ -117,7 +124,7 @@ public ResponseEntity poruci( HttpSession session) { } } - @PutMapping("/api/menadezer/promeni-status/{id}")//GRESKA U KUCANJU + @PutMapping("/api/menadzer/promeni-status/{id}") public ResponseEntity uPripremi(@PathVariable(name = "id") String id, HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java index b8e5628..35fedec 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/RestoranRestController.java @@ -63,13 +63,18 @@ public ResponseEntity> pretragaRestorana(@RequestBody S } - @GetMapping("/restorani/{id}") - public ResponseEntity prikazJednogRestorana(@PathVariable(name = "id") Long id){ - Restoran restoran = restoranService.findById(id); + @GetMapping( + value = "/restorani/{naziv}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public ResponseEntity prikazJednogRestorana(@PathVariable(name = "naziv") String naziv){ + Restoran restoran = restoranService.findByName(naziv); double prosecnaOcena = restoranService.getProsecnaOcena(restoran.getId()); Set komentari = restoranService.getKomentari(restoran.getId()); + if (restoran == null) + return new ResponseEntity<>(new RestoranIspisDto(), HttpStatus.OK); - return ResponseEntity.ok(restoranService.spremiZaIspis(restoran, prosecnaOcena, komentari)) ; + return new ResponseEntity<>(restoranService.spremiZaIspis(restoran, prosecnaOcena, komentari), HttpStatus.OK); } @PostMapping("/api/dodaj-artikal") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java index c54b96e..67d7b32 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java @@ -1,4 +1,98 @@ package vezbe.demo.dto; +import vezbe.demo.model.Pol; +import vezbe.demo.model.Uloga; + +import javax.persistence.*; +import java.util.Date; + +import static javax.persistence.EnumType.STRING; + public class KorisnikDto { + private String korisnickoIme; + private String lozinka; + private String ime; + private String prezime; + private String datumRodjenja; + private String pol; + private String uloga; + + public KorisnikDto() { + } + + public KorisnikDto(String korisnickoIme, String lozinka, String ime, String prezime, String datumRodjenja,String pol,String uloga) { + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.datumRodjenja = datumRodjenja; + this.pol = pol; + this.uloga = uloga; + } + public KorisnikDto(String korisnickoIme, String lozinka, String ime, String prezime, Date datumRodjenja,Pol pol,Uloga uloga) { + + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.datumRodjenja = datumRodjenja.toString(); + this.pol = pol.name(); + this.uloga = uloga.name(); + } + + public String getLozinka() { + return lozinka; + } + + public void setLozinka(String lozinka) { + this.lozinka = lozinka; + } + + public String getIme() { + return ime; + } + + public void setIme(String ime) { + this.ime = ime; + } + + public String getPrezime() { + return prezime; + } + + public void setPrezime(String prezime) { + this.prezime = prezime; + } + + public String getDatumRodjenja() { + return datumRodjenja; + } + + public void setDatumRodjenja(String datumRodjenja) { + this.datumRodjenja = datumRodjenja; + } + + public String getPol() { + return pol; + } + + public void setPol(String pol) { + this.pol = pol; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getUloga() { + return uloga; + } + + public void setUloga(String uloga) { + this.uloga = uloga; + } } diff --git a/Nadogradnja-demoa/src/main/resources/application.properties b/Nadogradnja-demoa/src/main/resources/application.properties index 03cbd8c..d2687de 100644 --- a/Nadogradnja-demoa/src/main/resources/application.properties +++ b/Nadogradnja-demoa/src/main/resources/application.properties @@ -20,3 +20,5 @@ spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.Im spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false hibernate.jdbc.lob.non_contextual_creation=true + + diff --git a/Nadogradnja-demoa/src/main/resources/static/images/kapricoza.jpg b/Nadogradnja-demoa/src/main/resources/static/images/kapricoza.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ee1d2fe50cece4ad879874cb8ecfebb337e394e GIT binary patch literal 162320 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 cD6o;Z*`j1 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 literal 0 HcmV?d00001 From 7c6266af7b416a4a2e1c169369819178ded195b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Fri, 1 Jul 2022 20:39:15 +0200 Subject: [PATCH 21/27] Registracija sa fronta Promenili smo sto je bilo osnovno za primanje informacija sa browsera i promenili smo formatiranje datuma kako bi se usaglasilo sa javascript tipom datuma. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../demo/controller/KupacRestController.java | 32 ++++++++++++++----- .../java/vezbe/demo/service/KupacService.java | 9 ++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 5dd83e6..4a4295b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -2,13 +2,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.KorisnikDto; import vezbe.demo.dto.KupacDto; import vezbe.demo.dto.LoginDto; import vezbe.demo.model.*; import vezbe.demo.service.KupacService; +import vezbe.demo.service.RestoranService; import javax.servlet.http.HttpSession; @@ -20,26 +23,39 @@ import java.util.Set; @RestController +@CrossOrigin("http://localhost:8080") +@RequestMapping(value = "/api/") public class KupacRestController { + private final KupacService kupacService; + @Autowired - private KupacService kupacService; + public KupacRestController(KupacService kupacService) { + this.kupacService = kupacService; + } + + @PostMapping( + value = "/registracija", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity registracija(@RequestBody KorisnikDto korisnikDto) throws ParseException { - @PostMapping("/api/registracija") - public ResponseEntity registracija(@RequestBody KupacDto kupacDto) throws ParseException { +// if(!kupacService.checkIfUsernameIsAvailable(korisnikDto.getKorisnickoIme())){ +// return new ResponseEntity<>("korisnicko ime nije slobodno", HttpStatus.OK); +// } - String sDate1=kupacDto.getDatumRodjenja(); + String sDate1=korisnikDto.getDatumRodjenja(); Date date1= null; - date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + date1 = new SimpleDateFormat("yyyy-MM-dd").parse(sDate1); - Pol pol = Pol.valueOf(kupacDto.getPol()); + Pol pol = Pol.valueOf(korisnikDto.getPol()); - Kupac kupac = new Kupac(kupacDto.getKorisnickoIme(), kupacDto.getLozinka(), kupacDto.getIme(), kupacDto.getPrezime(),pol, date1); + Kupac kupac = new Kupac(korisnikDto.getKorisnickoIme(), korisnikDto.getLozinka(), korisnikDto.getIme(), korisnikDto.getPrezime(),pol, date1); this.kupacService.save(kupac); - return ResponseEntity.ok("Uspesna registracija!"); + return new ResponseEntity<>("Uspesna registracija!", HttpStatus.OK); } @GetMapping("/api/sve-porudzbine") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index a10b7e9..3489c8b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -36,6 +36,15 @@ public Kupac save(Kupac kupac){ public void delete(Kupac kupac){kupacRepository.delete(kupac);} + public boolean checkIfUsernameIsAvailable(String korisnickoIme){ + for(Kupac kupac: kupacRepository.findAll()){ + if(korisnickoIme.equals(kupac.getKorisnickoIme())){ + return false; + } + } + return true; + } + public Set findAllPorudzbineByID(Long id){ return kupacRepository.getById(id).getListaPorudzbina(); From 00db4b3f3df4054a24d531e7b50e356a5707138c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sat, 2 Jul 2022 12:56:57 +0200 Subject: [PATCH 22/27] Login i registracija male izmene Dodali zagrade nakon u res.json() i sada vraca podatke kako treba. Nema portrebe da vraca nesto funkcija registracija Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../java/vezbe/demo/controller/KorisnikRestController.java | 7 +++---- .../java/vezbe/demo/controller/KupacRestController.java | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index fdb45eb..65835dc 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -37,12 +37,11 @@ public ResponseEntity login(@RequestBody KorisnikDto loginDto, Http return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK); } Korisnik loggedKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); - if (loggedKorisnik == null) - return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK); - + if (loggedKorisnik == null){ + return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK);} session.setAttribute("logovaniKorsinik", loggedKorisnik); + KorisnikDto korisnikDto= new KorisnikDto(loggedKorisnik.getKorisnickoIme(), loggedKorisnik.getLozinka(), loggedKorisnik.getIme(), loggedKorisnik.getPrezime(), loggedKorisnik.getDatumRodjenja(), loggedKorisnik.getPol(), loggedKorisnik.getUloga()); - System.out.println(korisnikDto.getUloga()); return new ResponseEntity<>(korisnikDto, HttpStatus.OK); } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 4a4295b..881df0e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -55,7 +55,7 @@ public ResponseEntity registracija(@RequestBody KorisnikDto korisnikDto) Kupac kupac = new Kupac(korisnikDto.getKorisnickoIme(), korisnikDto.getLozinka(), korisnikDto.getIme(), korisnikDto.getPrezime(),pol, date1); this.kupacService.save(kupac); - return new ResponseEntity<>("Uspesna registracija!", HttpStatus.OK); + return new ResponseEntity<>("", HttpStatus.OK); } @GetMapping("/api/sve-porudzbine") From c0daec8e5b9b958b103a0fe4a07954737bc5b54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 3 Jul 2022 12:50:08 +0200 Subject: [PATCH 23/27] Prikaz porudzbina Dodali smo da prikaz porudzbina kupca ne vraca onu koja je u sastavljanju --- .../configuration/DatabaseConfiguration.java | 18 ++-- .../controller/KorisnikRestController.java | 10 +- .../demo/controller/KupacRestController.java | 7 +- .../main/java/vezbe/demo/dto/LoginDto.java | 91 ++++++++++++++++--- .../java/vezbe/demo/dto/PorudzbinaDto.java | 40 ++++++++ .../java/vezbe/demo/service/KupacService.java | 38 +++++++- 6 files changed, 171 insertions(+), 33 deletions(-) create mode 100644 Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java index ab83f1b..898aaa3 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/configuration/DatabaseConfiguration.java @@ -96,13 +96,13 @@ public boolean instantiate(){ Artikal artikal11= new Artikal("naziv11", 500, TipArtikla.Jelo, 10, "opis11"); artikalRepository.save(artikal11); - StavkaPorudzbine stavkaPorudzbine1 = new StavkaPorudzbine(artikal1,100); - StavkaPorudzbine stavkaPorudzbine2 = new StavkaPorudzbine(artikal2,100); - StavkaPorudzbine stavkaPorudzbine3 = new StavkaPorudzbine(artikal3,100); - StavkaPorudzbine stavkaPorudzbine4 = new StavkaPorudzbine(artikal4,100); - StavkaPorudzbine stavkaPorudzbine5 = new StavkaPorudzbine(artikal5,100); - StavkaPorudzbine stavkaPorudzbine6 = new StavkaPorudzbine(artikal6,100); - StavkaPorudzbine stavkaPorudzbine7 = new StavkaPorudzbine(artikal1,100); + StavkaPorudzbine stavkaPorudzbine1 = new StavkaPorudzbine(artikal1,1); + StavkaPorudzbine stavkaPorudzbine2 = new StavkaPorudzbine(artikal2,2); + StavkaPorudzbine stavkaPorudzbine3 = new StavkaPorudzbine(artikal3,3); + StavkaPorudzbine stavkaPorudzbine4 = new StavkaPorudzbine(artikal4,4); + StavkaPorudzbine stavkaPorudzbine5 = new StavkaPorudzbine(artikal5,5); + StavkaPorudzbine stavkaPorudzbine6 = new StavkaPorudzbine(artikal6,6); + StavkaPorudzbine stavkaPorudzbine7 = new StavkaPorudzbine(artikal1,7); /* StavkaPorudzbine stavkaPorudzbine8 = new StavkaPorudzbine(artikal8,100); StavkaPorudzbine stavkaPorudzbine9 = new StavkaPorudzbine(artikal9,100); StavkaPorudzbine stavkaPorudzbine10 = new StavkaPorudzbine(artikal10,100); @@ -186,13 +186,13 @@ public boolean instantiate(){ porudzbina2.setPoruceniArtikli(lista_artikala2); porudzbina2.setRestoran(restoran); porudzbina2.setDatumIVreme(date1); - porudzbina2.setCena(10000); + porudzbina2.setCena(2000); porudzbina2.setKupac(kupac2); porudzbina2.setStatus(StatusPorudzbine.Obrada); porudzbinaRepository.save(porudzbina2); kupacRepository.save(kupac2); kupac2.getListaPorudzbina().add(porudzbina2); - Porudzbina porudzbina = new Porudzbina( lista_artikala, restoran, date1 , 123000,kupac2, StatusPorudzbine.CekaDostavljača); + Porudzbina porudzbina = new Porudzbina( lista_artikala, restoran, date1 , 5000,kupac2, StatusPorudzbine.CekaDostavljača); porudzbinaRepository.save(porudzbina); kupacRepository.save(kupac2); Date date = new Date(); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index 65835dc..62cbf4d 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -32,17 +32,19 @@ public KorisnikRestController(KorisnikService korisnikService) { value="login", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity login(@RequestBody KorisnikDto loginDto, HttpSession session) throws Exception{ + public ResponseEntity login(@RequestBody KorisnikDto loginDto, HttpSession session) throws Exception{ if(loginDto.getKorisnickoIme().isEmpty() || loginDto.getLozinka().isEmpty()){ - return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK); + return new ResponseEntity<>(new LoginDto(), HttpStatus.OK); } Korisnik loggedKorisnik = korisnikService.login(loginDto.getKorisnickoIme(), loginDto.getLozinka()); if (loggedKorisnik == null){ - return new ResponseEntity<>(new KorisnikDto(), HttpStatus.OK);} + return new ResponseEntity<>(new LoginDto(), HttpStatus.OK);} session.setAttribute("logovaniKorsinik", loggedKorisnik); KorisnikDto korisnikDto= new KorisnikDto(loggedKorisnik.getKorisnickoIme(), loggedKorisnik.getLozinka(), loggedKorisnik.getIme(), loggedKorisnik.getPrezime(), loggedKorisnik.getDatumRodjenja(), loggedKorisnik.getPol(), loggedKorisnik.getUloga()); - return new ResponseEntity<>(korisnikDto, HttpStatus.OK); + LoginDto dto = new LoginDto(loggedKorisnik.getKorisnickoIme(), loggedKorisnik.getLozinka(), loggedKorisnik.getIme(), loggedKorisnik.getPrezime(), loggedKorisnik.getDatumRodjenja(), loggedKorisnik.getPol(), loggedKorisnik.getUloga()); + dto.setSessionId(session.getId()); + return new ResponseEntity<>(dto, HttpStatus.OK); } @GetMapping("/api/profil") diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java index 881df0e..2e8a62a 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KupacRestController.java @@ -58,7 +58,9 @@ public ResponseEntity registracija(@RequestBody KorisnikDto korisnikDto) return new ResponseEntity<>("", HttpStatus.OK); } - @GetMapping("/api/sve-porudzbine") + @GetMapping(value="/sve-porudzbine", + produces = MediaType.APPLICATION_JSON_VALUE + ) public ResponseEntity> sveProduzbine(HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -73,7 +75,8 @@ public ResponseEntity> sveProduzbine(HttpSession session){ System.out.println("PRAZNA LISTA"); ResponseEntity.noContent(); } - return ResponseEntity.ok( kupacService.findAllPorudzbineByID(loggedKorisnik.getId())); +// return new ResponseEntity( kupacService.findAllPorudzbineByID(loggedKorisnik.getId()), HttpStatus.OK); + return new ResponseEntity( kupacService.findAllPorudzbineByID(loggedKorisnik.getId()), HttpStatus.OK); } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java index 2cc2689..3bd54ab 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/LoginDto.java @@ -1,37 +1,52 @@ package vezbe.demo.dto; -import vezbe.demo.model.*; +import vezbe.demo.model.Pol; +import vezbe.demo.model.Uloga; import javax.persistence.*; -import java.io.Serializable; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; -import java.util.HashSet; -import java.util.Set; import static javax.persistence.EnumType.STRING; public class LoginDto { - private String korisnickoIme; - - private String lozinka; + private String lozinka; + private String ime; + private String prezime; + private String datumRodjenja; + private String pol; + private String uloga; + private String sessionId; public LoginDto() { } - public LoginDto(String korisnickoIme, String lozinka) { + public LoginDto(String korisnickoIme, String lozinka, String ime, String prezime, String datumRodjenja,String pol,String uloga) { this.korisnickoIme = korisnickoIme; this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.datumRodjenja = datumRodjenja; + this.pol = pol; + this.uloga = uloga; } + public LoginDto(String korisnickoIme, String lozinka, String ime, String prezime, Date datumRodjenja,Pol pol,Uloga uloga) { - public String getKorisnickoIme() { - return korisnickoIme; + this.korisnickoIme = korisnickoIme; + this.lozinka = lozinka; + this.ime = ime; + this.prezime = prezime; + this.datumRodjenja = datumRodjenja.toString(); + this.pol = pol.name(); + this.uloga = uloga.name(); } - public void setKorisnickoIme(String korisnickoIme) { - this.korisnickoIme = korisnickoIme; + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; } public String getLozinka() { @@ -41,4 +56,52 @@ public String getLozinka() { public void setLozinka(String lozinka) { this.lozinka = lozinka; } + + public String getIme() { + return ime; + } + + public void setIme(String ime) { + this.ime = ime; + } + + public String getPrezime() { + return prezime; + } + + public void setPrezime(String prezime) { + this.prezime = prezime; + } + + public String getDatumRodjenja() { + return datumRodjenja; + } + + public void setDatumRodjenja(String datumRodjenja) { + this.datumRodjenja = datumRodjenja; + } + + public String getPol() { + return pol; + } + + public void setPol(String pol) { + this.pol = pol; + } + + public String getKorisnickoIme() { + return korisnickoIme; + } + + public void setKorisnickoIme(String korisnickoIme) { + this.korisnickoIme = korisnickoIme; + } + + public String getUloga() { + return uloga; + } + + public void setUloga(String uloga) { + this.uloga = uloga; + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java new file mode 100644 index 0000000..ee0b8cb --- /dev/null +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java @@ -0,0 +1,40 @@ +package vezbe.demo.dto; + +public class PorudzbinaDto { + private String id; + private double cena; + private String datum; + + public PorudzbinaDto(String id, double cena, String datum) { + this.id = id; + this.cena = cena; + this.datum = datum; + } + + public PorudzbinaDto() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public double getCena() { + return cena; + } + + public void setCena(double cena) { + this.cena = cena; + } + + public String getDatum() { + return datum; + } + + public void setDatum(String datum) { + this.datum = datum; + } +} diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java index 3489c8b..8c496ab 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KupacService.java @@ -2,13 +2,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import vezbe.demo.dto.PorudzbinaDto; import vezbe.demo.model.Kupac; import vezbe.demo.model.Porudzbina; +import vezbe.demo.model.StatusPorudzbine; import vezbe.demo.repository.KupacRepository; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; @Service public class KupacService { @@ -47,7 +49,15 @@ public boolean checkIfUsernameIsAvailable(String korisnickoIme){ public Set findAllPorudzbineByID(Long id){ - return kupacRepository.getById(id).getListaPorudzbina(); + Set listaPorudzbina = kupacRepository.getById(id).getListaPorudzbina(); + Set bezPrazneListe = new HashSet<>(); + for(Porudzbina porudzbina: listaPorudzbina) { + if (porudzbina.getStatusPorudzbine().equals(StatusPorudzbine.USastavljanu)) { + continue; + } + bezPrazneListe.add(porudzbina); + } + return bezPrazneListe; } public void updateKupac(Kupac kupac, Porudzbina porudzbina){ kupac.getListaPorudzbina().add(porudzbina); @@ -58,5 +68,25 @@ public void dodajBodove(double cena, Kupac kupac){ kupac.setBodovi((int) (kupac.getBodovi() + noviBodovi)); kupacRepository.save(kupac); } + public Set svePorudzbineBasicInfo(Long id){ + Set porudzbine = kupacRepository.getById(id).getListaPorudzbina(); + + Set dto = new HashSet<>(); + for(Porudzbina porudzbina: porudzbine){ + if(porudzbina.getStatusPorudzbine().equals(StatusPorudzbine.USastavljanu)){ + continue; + } + Date date1 = porudzbina.getDatumIVreme(); + + + PorudzbinaDto item = new PorudzbinaDto(porudzbina.getUUID().toString(),porudzbina.getCena(),porudzbina.getDatumIVreme().toString()); + dto.add(item); + System.out.println(item.getId()); + System.out.println(item.getCena()); + System.out.println(item.getDatum()); + } + + return dto; + } } From 3dc4680c87ecdfb4c3a3edf3534bec758d44ba49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 3 Jul 2022 14:17:06 +0200 Subject: [PATCH 24/27] Menadzer pregled porudzbina Ispravili smo visestrulo slanje istih porudzbina i dodali datum i vreme u PorudzbinaDto kako bi na frontu mogli da ispisemo to. --- .../controller/KorisnikRestController.java | 3 ++- .../controller/PorudzbinaRestController.java | 10 ++++++---- .../java/vezbe/demo/dto/PorudzbinaDto.java | 18 ++++++++++++++++++ .../vezbe/demo/service/PorudzbinaService.java | 17 +++++++++++++---- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index 62cbf4d..4483170 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -47,7 +47,8 @@ public ResponseEntity login(@RequestBody KorisnikDto loginDto, HttpSes return new ResponseEntity<>(dto, HttpStatus.OK); } - @GetMapping("/api/profil") + @GetMapping(value = "profil", + produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getProfil(HttpSession session){ Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 27d7c0c..49828ef 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -5,6 +5,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import vezbe.demo.dto.PorudzbinaDto; import vezbe.demo.dto.RestoranImeDto; import vezbe.demo.model.*; import vezbe.demo.service.PorudzbinaService; @@ -23,8 +24,9 @@ public class PorudzbinaRestController { private PorudzbinaService porudzbinaService; - @GetMapping("/api/pregledPorudzbina") - public ResponseEntity> getPorudzbine(HttpSession session) { + @GetMapping(value="/pregled-porudzbina", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getPorudzbine(HttpSession session) { List listaPorudzbina = new ArrayList<>(); Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik.getUloga() != Uloga.Menadzer) { @@ -32,9 +34,9 @@ public ResponseEntity> getPorudzbine(HttpSession session) { } Restoran r = ((Menadzer) loggedKorisnik).getRestoran(); - listaPorudzbina = porudzbinaService.getListaPorudzbina(r); + List dtoList = porudzbinaService.getListaPorudzbina(r); - return ResponseEntity.ok(listaPorudzbina); + return ResponseEntity.ok(dtoList); } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java index ee0b8cb..375b02e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/PorudzbinaDto.java @@ -1,9 +1,12 @@ package vezbe.demo.dto; +import vezbe.demo.model.StatusPorudzbine; + public class PorudzbinaDto { private String id; private double cena; private String datum; + private String status; public PorudzbinaDto(String id, double cena, String datum) { this.id = id; @@ -11,6 +14,21 @@ public PorudzbinaDto(String id, double cena, String datum) { this.datum = datum; } + public PorudzbinaDto(String id, double cena, String datum, StatusPorudzbine status) { + this.id = id; + this.cena = cena; + this.datum = datum; + this.status = status.toString(); + } + + public String getStatus() { + return status; + } + + public void setStatus(StatusPorudzbine status) { + this.status = status.toString(); + } + public PorudzbinaDto() { } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index de6add7..4b9ac7c 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import vezbe.demo.dto.PorudzbinaDto; import vezbe.demo.model.*; import vezbe.demo.repository.PorudzbinaRepository; import java.util.*; @@ -24,20 +25,28 @@ public class PorudzbinaService { DostavljacService dostavljacService; - public List getListaPorudzbina(Restoran restoran) { + public List getListaPorudzbina(Restoran restoran) { List listaPorudzbina = new ArrayList<>(); for (Porudzbina porudzbina : porudzbinaRepository.findAll()) { for (StavkaPorudzbine stavkaPorudzbine : porudzbina.getPoruceniArtikli()) { for (Artikal artikal : restoran.getPonuda()) { if (stavkaPorudzbine.getPoruceniArtikal().getId().equals(artikal.getId())) { - listaPorudzbina.add(porudzbina); - break; + if(!listaPorudzbina.contains(porudzbina)) { + listaPorudzbina.add(porudzbina); + break; + } } } } } - return listaPorudzbina; + List dtoList = new ArrayList<>(); + for(Porudzbina porudzbina: listaPorudzbina){ + PorudzbinaDto dto = new PorudzbinaDto(porudzbina.getId().toString(), porudzbina.getCena(), porudzbina.getDatumIVreme().toString(), porudzbina.getStatus()); + dtoList.add(dto); + } + + return dtoList; } public Set findCekaDostavljaca(){ Set setp = new HashSet<>(); From 79d2042063a6d0559dc2554c0a88478cd0346405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 3 Jul 2022 16:35:17 +0200 Subject: [PATCH 25/27] Admin pregled svih korisnika front Samo stavili da umesto liste korisnika vraca listu korisnikDto-ova zbog mogucnosti ispisa datuma u browseru. Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../demo/controller/KorisnikRestController.java | 9 +++++---- .../src/main/java/vezbe/demo/dto/KorisnikDto.java | 11 +++++++++++ .../java/vezbe/demo/service/KorisnikService.java | 12 ++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java index 4483170..f883098 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/KorisnikRestController.java @@ -61,15 +61,16 @@ public ResponseEntity getProfil(HttpSession session){ return ResponseEntity.ok(loggedKorisnik); } - @GetMapping("/api/korisnici") - public ResponseEntity> getSveKorisnike(HttpSession session){ + @GetMapping(value = "korisnici", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getSveKorisnike(HttpSession session){ List listaKorisnika = new ArrayList<>(); Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if(loggedKorisnik.getUloga()!=Uloga.Admin){ return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } - listaKorisnika = korisnikService.findAll(); - return ResponseEntity.ok(listaKorisnika); + List dtoList = korisnikService.findAll(); + return new ResponseEntity<>(dtoList, HttpStatus.OK); } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java index 67d7b32..bbaa90e 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/dto/KorisnikDto.java @@ -1,5 +1,6 @@ package vezbe.demo.dto; +import vezbe.demo.model.Korisnik; import vezbe.demo.model.Pol; import vezbe.demo.model.Uloga; @@ -9,6 +10,7 @@ import static javax.persistence.EnumType.STRING; public class KorisnikDto { + private String korisnickoIme; private String lozinka; private String ime; @@ -19,6 +21,15 @@ public class KorisnikDto { public KorisnikDto() { } + public KorisnikDto(Korisnik korisnik) { + this.korisnickoIme = korisnik.getKorisnickoIme(); + this.lozinka = korisnik.getLozinka(); + this.ime = korisnik.getIme(); + this.prezime = korisnik.getPrezime(); + this.datumRodjenja = korisnik.getDatumRodjenja().toString(); + this.pol = korisnik.getPol().toString(); + this.uloga = korisnik.getUloga().toString(); + } public KorisnikDto(String korisnickoIme, String lozinka, String ime, String prezime, String datumRodjenja,String pol,String uloga) { this.korisnickoIme = korisnickoIme; diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java index f5be5e1..7cb7029 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/KorisnikService.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import vezbe.demo.dto.KorisnikDto; import vezbe.demo.model.*; import vezbe.demo.repository.KorisnikRepository; @@ -29,9 +30,16 @@ public Korisnik login(String username, String password) { return korisnik; } - public List findAll(){ - return korisnikRepository.findAll(); + public List findAll(){ + List listaKorisnika= new ArrayList<>(); + for(Korisnik korisnik: korisnikRepository.findAll()){ + KorisnikDto korisnikDto = new KorisnikDto(korisnik); + listaKorisnika.add(korisnikDto); + } + return listaKorisnika; } + + } From 983cea7034f4cd5f44d1ab9129897bb2adfffcd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Sun, 3 Jul 2022 19:28:30 +0200 Subject: [PATCH 26/27] Kreiranje dostavljaca/menadzera Standardne izmene kako bi radilo prihvatanje podataka sa fronta Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/DostavljacRestController.java | 20 +++++++++++++------ .../controller/MenadzerRestController.java | 16 +++++++++++---- .../vezbe/demo/service/DostavljacService.java | 4 ++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java index 4d626fd..4e5212b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/DostavljacRestController.java @@ -8,6 +8,7 @@ import vezbe.demo.dto.MenadzerDto; import vezbe.demo.model.*; import vezbe.demo.service.DostavljacService; +import vezbe.demo.service.KorisnikService; import vezbe.demo.service.MenadzerService; import javax.servlet.http.HttpSession; import java.text.ParseException; @@ -18,31 +19,38 @@ import java.util.Set; @RestController +@RequestMapping(value = "/api/") +@CrossOrigin(origins = "http://localhost:8080") public class DostavljacRestController { + private final DostavljacService dostavljacService; + @Autowired - private DostavljacService dostavljacService; + public DostavljacRestController(DostavljacService dostavljacService) { + this.dostavljacService = dostavljacService; + } + - @PostMapping("/api/kreiraj-dostavljaca") + @PostMapping("kreiraj-dostavljaca") public ResponseEntity kreirajDostavljaca(@RequestBody DostavljacDto dostavljacDto, HttpSession session) throws ParseException { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); if (loggedKorisnik == null){ - return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + return new ResponseEntity<>("Forbidden", HttpStatus.OK); } if(loggedKorisnik.getUloga()!= Uloga.Admin){ - return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); + return new ResponseEntity<>("Nemate dozvolu za ovu funkciju", HttpStatus.OK); } String sDate1=dostavljacDto.getDatumRodjenja(); Date date1= null; - date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + date1 = new SimpleDateFormat("yyyy-MM-dd").parse(sDate1); Pol pol = Pol.valueOf(dostavljacDto.getPol()); Dostavljac dostavljac = new Dostavljac(dostavljacDto.getKorisnickoIme(), dostavljacDto.getLozinka(), dostavljacDto.getIme(), dostavljacDto.getPrezime(),pol, date1); this.dostavljacService.save(dostavljac); - return ResponseEntity.ok("Uspesno kreiranje dostavljaca!"); + return new ResponseEntity<>("", HttpStatus.OK); } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java index 4183d22..4b50592 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/MenadzerRestController.java @@ -2,10 +2,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import vezbe.demo.dto.MenadzerDto; import vezbe.demo.model.*; +import vezbe.demo.service.DostavljacService; import vezbe.demo.service.MenadzerService; import javax.servlet.http.HttpSession; import java.text.ParseException; @@ -15,14 +17,20 @@ import java.util.List; @RestController +@RequestMapping(value = "/api/") +@CrossOrigin(origins = "http://localhost:8080") public class MenadzerRestController { - @Autowired - private MenadzerService menadzerService; + private final MenadzerService menadzerService; + @Autowired + public MenadzerRestController(MenadzerService menadzerService) { + this.menadzerService = menadzerService; + } - @PostMapping("/api/kreiraj-menadzera") + @PostMapping(value = "kreiraj-menadzera" + ) public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzerDto, HttpSession session) throws ParseException { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -35,7 +43,7 @@ public ResponseEntity kreirajMenadzera(@RequestBody MenadzerDto menadzer String sDate1=menadzerDto.getDatumRodjenja(); Date date1= null; - date1 = new SimpleDateFormat("yyyy/dd/MM").parse(sDate1); + date1 = new SimpleDateFormat("yyyy-MM-dd").parse(sDate1); Pol pol = Pol.valueOf(menadzerDto.getPol()); diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java index e72c87b..55b8a83 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java @@ -31,8 +31,8 @@ public List findAll(){ return dostavljacRepository.findAll(); } - public Dostavljac save(Dostavljac dostavljac){ - return dostavljacRepository.save(dostavljac); + public void save(Dostavljac dostavljac){ + dostavljacRepository.save(dostavljac); } public void delete(Dostavljac dostavljac){dostavljacRepository.delete(dostavljac);} From acf3b2bbd91628fa39c234cb2964a003e547f1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavle=20Krsti=C4=87?= Date: Mon, 4 Jul 2022 12:57:50 +0200 Subject: [PATCH 27/27] Promena statusa porudzbine Ispravili dupliranje iste porudzbine prilikom promene statusa porudzbine i omogucili rad ove finkcije sa fronta Co-Authored-By: MrDotMan02 <104990681+MrDotMan02@users.noreply.github.com> --- .../controller/PorudzbinaRestController.java | 101 +++++++++++------- .../vezbe/demo/service/DostavljacService.java | 34 +++++- .../vezbe/demo/service/PorudzbinaService.java | 21 ++-- 3 files changed, 108 insertions(+), 48 deletions(-) diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java index 49828ef..ea7d3ad 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/controller/PorudzbinaRestController.java @@ -24,8 +24,8 @@ public class PorudzbinaRestController { private PorudzbinaService porudzbinaService; - @GetMapping(value="/pregled-porudzbina", - produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/pregled-porudzbina", + produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getPorudzbine(HttpSession session) { List listaPorudzbina = new ArrayList<>(); Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); @@ -40,26 +40,30 @@ public ResponseEntity> getPorudzbine(HttpSession session) { } - @GetMapping("/api/dostavljac/ceka-dostavljaca") - public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSession session) { + @GetMapping(value = "ceka-dostavljaca", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> porudzbineStanjeCekaDostavljaca(HttpSession session) { List listaPorudzbina = new ArrayList<>(); Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null) { + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } if (loggedKorisnik.getUloga() != Uloga.Dostavljac) { return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } - return ResponseEntity.ok(porudzbinaService.findCekaDostavljaca()); } + @PostMapping("/api/izaberi-restoran") - public ResponseEntity izaberRestoran(@RequestBody RestoranImeDto restoranImeDto, HttpSession session){ + public ResponseEntity izaberRestoran(@RequestBody RestoranImeDto restoranImeDto, HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + if (loggedKorisnik.getUloga() != Uloga.Kupac) { return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); } Kupac kupac = (Kupac) loggedKorisnik; @@ -69,20 +73,21 @@ public ResponseEntity izaberRestoran(@RequestBody RestoranImeDto res return ResponseEntity.ok(porudzbinaService.getAll()); } + @PostMapping( - value="dodaj-u-korpu", + value = "dodaj-u-korpu", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, HttpSession session){ + public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + if (loggedKorisnik.getUloga() != Uloga.Kupac) { return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); } - Kupac kupac =(Kupac) loggedKorisnik; + Kupac kupac = (Kupac) loggedKorisnik; Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); @@ -90,50 +95,53 @@ public ResponseEntity dodajUKorpu(@RequestBody KorpaDto korpaDto, Ht } + @PostMapping("/api/ukloni-iz-korpe") - public ResponseEntity ukloniIzKorpe(@RequestBody KorpaDto korpaDto, HttpSession session){ + public ResponseEntity ukloniIzKorpe(@RequestBody KorpaDto korpaDto, HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + if (loggedKorisnik.getUloga() != Uloga.Kupac) { return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); } - Kupac kupac =(Kupac) loggedKorisnik; + Kupac kupac = (Kupac) loggedKorisnik; Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); return ResponseEntity.ok(porudzbinaService.ukloniStavkuPorudzbine(korpaDto.getArtikal(), korpaDto.getKolicina(), porudzbina)); } + @PostMapping("/api/poruci") - public ResponseEntity poruci( HttpSession session) { + public ResponseEntity poruci(HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Kupac){ + if (loggedKorisnik.getUloga() != Uloga.Kupac) { return new ResponseEntity("Nemate dozvolu za ovu funkciju", HttpStatus.BAD_REQUEST); } - Kupac kupac =(Kupac) loggedKorisnik; + Kupac kupac = (Kupac) loggedKorisnik; Porudzbina porudzbina = porudzbinaService.findPorduzbinaUSastavljanju(kupac); porudzbinaService.checkIfEmpty(porudzbina); - if(porudzbina.getPoruceniArtikli().isEmpty()){ - return new ResponseEntity("Porudzbina je prazna", HttpStatus.BAD_REQUEST); - }else{ - return ResponseEntity.ok(porudzbina); + if (porudzbina.getPoruceniArtikli().isEmpty()) { + return new ResponseEntity("Porudzbina je prazna", HttpStatus.BAD_REQUEST); + } else { + return ResponseEntity.ok(porudzbina); } } + @PutMapping("/api/menadzer/promeni-status/{id}") - public ResponseEntity uPripremi(@PathVariable(name = "id") String id, HttpSession session){ + public ResponseEntity uPripremi(@PathVariable(name = "id") String id, HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Menadzer){ + if (loggedKorisnik.getUloga() != Uloga.Menadzer) { return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } @@ -143,26 +151,47 @@ public ResponseEntity uPripremi(@PathVariable(name = "id") String id return ResponseEntity.ok(porudzbina); } - @PutMapping("/api/dostavljac/promeni-status/{id}") - public ResponseEntity uTransportu(@PathVariable(name = "id") String id, HttpSession session){ + + @PutMapping(value = "dostavljac/promeni-status/{id}", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity uTransportu(@PathVariable(name = "id") String id, HttpSession session) { Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); - if (loggedKorisnik == null){ + if (loggedKorisnik == null) { return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); } - if(loggedKorisnik.getUloga()!= Uloga.Dostavljac){ + if (loggedKorisnik.getUloga() != Uloga.Dostavljac) { return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); } Dostavljac dostavljac = (Dostavljac) loggedKorisnik; - Porudzbina porudzbina = porudzbinaService.promeniStatusDostavljac(dostavljac,id); - if(porudzbina==null){ + Porudzbina porudzbina = porudzbinaService.promeniStatusDostavljac(dostavljac, id); + if (porudzbina == null) { return new ResponseEntity("Nemate pristup ovoj porudzbini", HttpStatus.BAD_REQUEST); } + PorudzbinaDto porudzbinaDto = new PorudzbinaDto(porudzbina.getUUID().toString(), porudzbina.getCena(), porudzbina.getDatumIVreme().toString(), porudzbina.getStatus()); - - return ResponseEntity.ok(porudzbina); + return new ResponseEntity<>("", HttpStatus.OK); } + @GetMapping(value = "dostavljac/porudzbine/", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> porudzbineDostavljaca(HttpSession session) { + Korisnik loggedKorisnik = (Korisnik) session.getAttribute("logovaniKorsinik"); + if (loggedKorisnik == null) { + return new ResponseEntity("Forbidden", HttpStatus.FORBIDDEN); + } + if (loggedKorisnik.getUloga() != Uloga.Dostavljac) { + return new ResponseEntity("Nemate pristupa ovim podacima", HttpStatus.BAD_REQUEST); + } + Dostavljac dostavljac = (Dostavljac) loggedKorisnik; + Set set = new HashSet<>(); + for(Porudzbina porudzbina: dostavljac.getPorudzbineZaDostavu()){ + PorudzbinaDto dto = new PorudzbinaDto(porudzbina.getUUID().toString(), porudzbina.getCena(), porudzbina.getDatumIVreme().toString(), porudzbina.getStatus()); + set.add(dto); + } + + return new ResponseEntity<>(set, HttpStatus.OK); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java index 55b8a83..7b1307b 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/DostavljacService.java @@ -2,10 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import vezbe.demo.model.Dostavljac; -import vezbe.demo.model.Kupac; -import vezbe.demo.model.Menadzer; -import vezbe.demo.model.Porudzbina; +import vezbe.demo.model.*; import vezbe.demo.repository.DostavljacRepository; import vezbe.demo.repository.MenadzerRepository; @@ -40,4 +37,33 @@ public void save(Dostavljac dostavljac){ public Set findAllById(Long id){ return dostavljacRepository.getById(id).getPorudzbineZaDostavu(); } + + public void addPorudzbina(Dostavljac dostavljac, Porudzbina porudzbina){ +// for(Porudzbina porudzbina1: dostavljac.getPorudzbineZaDostavu()){ +// if(porudzbina1.getUUID().equals(porudzbina.getUUID())){ +// dostavljac.getPorudzbineZaDostavu().remove(porudzbina1); +// } +// } + dostavljac.getPorudzbineZaDostavu().add(porudzbina); + dostavljacRepository.save(dostavljac); + } + public Dostavljac findDostavljac(String korisnickoIme){ + for(Dostavljac dostavljac: dostavljacRepository.findAll()){ + if(dostavljac.getKorisnickoIme().equals(korisnickoIme)){ + return dostavljac; + } + } + return null; + } + public void addCondition(Dostavljac dostavljac, Porudzbina porudzbina){ + for(Porudzbina p: dostavljac.getPorudzbineZaDostavu()){ + if(p.getUUID().equals(porudzbina.getUUID())){ + p.setStatusPorudzbine(StatusPorudzbine.UTransportu); + dostavljacRepository.save(dostavljac); + return; + } + } + dostavljac.getPorudzbineZaDostavu().add(porudzbina); + dostavljacRepository.save(dostavljac); + } } diff --git a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java index 4b9ac7c..65cf970 100644 --- a/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java +++ b/Nadogradnja-demoa/src/main/java/vezbe/demo/service/PorudzbinaService.java @@ -48,11 +48,12 @@ public List getListaPorudzbina(Restoran restoran) { return dtoList; } - public Set findCekaDostavljaca(){ - Set setp = new HashSet<>(); + public Set findCekaDostavljaca(){ + Set setp = new HashSet<>(); for(Porudzbina porudzbina: porudzbinaRepository.findAll()){ if(porudzbina.getStatus().equals(StatusPorudzbine.CekaDostavljača)){ - setp.add(porudzbina); + PorudzbinaDto porudzbinaDto = new PorudzbinaDto(porudzbina.getUUID().toString(),porudzbina.getCena(), porudzbina.getDatumIVreme().toString(), porudzbina.getStatus()); + setp.add(porudzbinaDto); } } return setp; @@ -198,11 +199,10 @@ public Porudzbina promeniStatusDostavljac(Dostavljac dostavljac, String id){ listaPorudzbina = porudzbinaRepository.findAll(); for(Porudzbina porudzbina: listaPorudzbina) { if (porudzbina.getStatus().equals(StatusPorudzbine.CekaDostavljača)) { - p = porudzbina; - p.setStatusPorudzbine(StatusPorudzbine.UTransportu); - porudzbinaRepository.save(p); - dostavljac.getPorudzbineZaDostavu().add(p); - dostavljacService.save(dostavljac); +// p = porudzbina; + porudzbina.setStatusPorudzbine(StatusPorudzbine.UTransportu); + porudzbinaRepository.save(porudzbina); + dostavljacService.addCondition(dostavljac,porudzbina); return p; } else if (porudzbina.getStatus().equals(StatusPorudzbine.UTransportu)) { for (Porudzbina porudzbina1 : dostavljacService.findAllById(dostavljac.getId())) { @@ -219,8 +219,13 @@ public Porudzbina promeniStatusDostavljac(Dostavljac dostavljac, String id){ } } } +// Set ispis = new HashSet<>(); +// for(Porudzbina porudzbinaL p) return p; } + public Dostavljac findDostavljac(String korisnickoIme){ + return dostavljacService.findDostavljac(korisnickoIme); + } }