diff --git a/.gitignore b/.gitignore index 8186e8d..0a305ea 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ build/ ### Database files ### *.db *.mv.db + +### Log files ### +data/maradona/dbfile.mv.db diff --git a/src/main/java/com/maradona/backend/controllers/api/EmployeeController.java b/src/main/java/com/maradona/backend/controllers/api/EmployeeController.java index a9a3fb6..ade2817 100644 --- a/src/main/java/com/maradona/backend/controllers/api/EmployeeController.java +++ b/src/main/java/com/maradona/backend/controllers/api/EmployeeController.java @@ -21,6 +21,7 @@ import com.maradona.backend.services.EmployeeService; * * Endpoints: * - GET /api/employee + * - GET /api/employee/{eid} * - GET /api/employee/all * - GET /api/employee/from-skill * - GET /api/employee/skill/all @@ -40,15 +41,29 @@ public class EmployeeController { Long user = Long.valueOf(1); /** - * Returns a specific employee from the database. + * Returns the employee profile of the currently logged in user. * - * @param id The ID of the requested employee. - * @return The employee with the requested ID. + * @return The employee profile of the currently logged in user. * @see com.maradona.backend.entities.Employee */ @GetMapping({ "/", "" }) - public ResponseEntity get(@RequestParam Long id) { - var employee = employeeService.getEmployeeById(id); + public ResponseEntity get() { + var employee = employeeService.getEmployeeByEid(user); + return employee + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + /** + * Returns a specific employee from the database. + * + * @param eid The ID of the requested employee. + * @return The employee with the requested ID. + * @see com.maradona.backend.entities.Employee + */ + @GetMapping("/{eid}") + public ResponseEntity get(@RequestParam Long eid) { + var employee = employeeService.getEmployeeByEid(eid); return employee .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); @@ -68,15 +83,15 @@ public class EmployeeController { /** * Returns a list of employees for a given secondary skill and level. * - * @param skillId ID of the secondary skill - * @param level Level of the secondary skill + * @param ssid ID of the secondary skill + * @param level Level of the secondary skill * @return list of employees * @see com.maradona.backend.entities.Employee * @see com.maradona.backend.entities.SecondarySkill */ @GetMapping("/from-skill") - public ResponseEntity> getFromSkill(@RequestParam Long skillId, @RequestParam Integer level) { - return ResponseEntity.ok(employeeService.getEmployeesBySecondarySkill(skillId, level)); + public ResponseEntity> getFromSkill(@RequestParam Long ssid, @RequestParam Integer level) { + return ResponseEntity.ok(employeeService.getEmployeesBySecondarySkill(ssid, level)); } /** @@ -97,30 +112,30 @@ public class EmployeeController { /** * Updates the level of a secondary skill in the user profile. * - * @param skillId ID of the secondary skill - * @param level Level of the secondary skill + * @param ssid ID of the secondary skill + * @param level Level of the secondary skill * @return HTTP status indicating the outcome of the operation * @see com.maradona.backend.entities.Employee * @see com.maradona.backend.entities.SecondarySkill * @see com.maradona.backend.entities.EmployeeSecondarySkill */ @PutMapping("/skill/level") - public ResponseEntity putSkillLevel(@RequestParam Long skillId, @RequestParam Integer level) { - employeeService.updateSecondarySkillLevel(user, skillId, level); + public ResponseEntity putSkillLevel(@RequestParam Long ssid, @RequestParam Integer level) { + employeeService.updateSecondarySkillLevel(user, ssid, level); return ResponseEntity.ok().build(); } /** * Removes a secondary skill from the user profile. * - * @param id The ID of the secondary skill to be removed + * @param ssid The ID of the secondary skill to be removed * @return HTTP status indicating the outcome of the operation * @see com.maradona.backend.entities.Employee * @see com.maradona.backend.entities.SecondarySkill */ @DeleteMapping("/skill") - public ResponseEntity delete(@RequestParam Long id) { - employeeService.deleteSecondarySkillFromEmployee(user, id); + public ResponseEntity delete(@RequestParam Long ssid) { + employeeService.deleteSecondarySkillFromEmployee(user, ssid); return ResponseEntity.noContent().build(); } } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/controllers/api/FormOfAdressController.java b/src/main/java/com/maradona/backend/controllers/api/FormOfAdressController.java index 7051ced..feffeef 100644 --- a/src/main/java/com/maradona/backend/controllers/api/FormOfAdressController.java +++ b/src/main/java/com/maradona/backend/controllers/api/FormOfAdressController.java @@ -37,13 +37,13 @@ class FormOfAdressController { /** * Returns the form of address with the given ID. * - * @param id The ID of the form of address to return. + * @param fid The ID of the form of address to return. * @return The description of the form of address with the given ID. * @see com.maradona.backend.entities.FormOfAddress */ @GetMapping({ "/", "" }) - public ResponseEntity getFormOfAdress(@RequestParam Long id) { - return formOfAdressService.getFormOfAddressById(id) + public ResponseEntity getFormOfAdress(@RequestParam Long fid) { + return formOfAdressService.getFormOfAddressByFid(fid) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @@ -78,14 +78,14 @@ class FormOfAdressController { /** * Updates the description of a form of address. * - * @param id The ID of the form of address to update. + * @param fid The ID of the form of address to update. * @param description The new description of the form of address. * @return The updated form of address. * @see com.maradona.backend.entities.FormOfAddress */ @PutMapping({ "/", "" }) - public ResponseEntity updateFormOfAdress(@RequestParam Long id, @RequestBody String description) { - var formOfAddress = formOfAdressService.getFormOfAddressById(id).orElse(null); + public ResponseEntity updateFormOfAdress(@RequestParam Long fid, @RequestBody String description) { + var formOfAddress = formOfAdressService.getFormOfAddressByFid(fid).orElse(null); if (formOfAddress == null) { return ResponseEntity.notFound().build(); } @@ -97,17 +97,17 @@ class FormOfAdressController { /** * Deletes a form of address. * - * @param id The ID of the form of address to delete. + * @param fid The ID of the form of address to delete. * @return The deleted form of address. * @see com.maradona.backend.entities.FormOfAddress */ @DeleteMapping({ "/", "" }) - public ResponseEntity deleteFormOfAdress(@RequestParam Long id) { - var formOfAddress = formOfAdressService.getFormOfAddressById(id).orElse(null); + public ResponseEntity deleteFormOfAdress(@RequestParam Long fid) { + var formOfAddress = formOfAdressService.getFormOfAddressByFid(fid).orElse(null); if (formOfAddress == null) { return ResponseEntity.notFound().build(); } - formOfAdressService.deleteFormOfAddress(id); + formOfAdressService.deleteFormOfAddress(fid); return ResponseEntity.ok().build(); } } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/controllers/api/PrimarySkillController.java b/src/main/java/com/maradona/backend/controllers/api/PrimarySkillController.java index db7c709..ba6739d 100644 --- a/src/main/java/com/maradona/backend/controllers/api/PrimarySkillController.java +++ b/src/main/java/com/maradona/backend/controllers/api/PrimarySkillController.java @@ -42,13 +42,13 @@ public class PrimarySkillController { /** * Returns a specific primary skill from the database. * - * @param id The ID of the requested primary skill. + * @param pid The ID of the requested primary skill. * @return The primary skill with the requested ID. * @see com.maradona.backend.entities.PrimarySkill */ @GetMapping({ "/", "" }) - public ResponseEntity get(@RequestParam Long id) { - return primarySkillService.getPrimarySkillById(id) + public ResponseEntity get(@RequestParam Long pid) { + return primarySkillService.getPrimarySkillByPsid(pid) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @@ -93,21 +93,21 @@ public class PrimarySkillController { /** * Deletes a primary skill from the database. * - * @param id The ID of the primary skill to be deleted + * @param pid The ID of the primary skill to be deleted * @return HTTP status indicating the outcome of the operation * @see com.maradona.backend.entities.PrimarySkill */ @DeleteMapping({ "/", "" }) - public ResponseEntity delete(@RequestParam Long id) { - var primarySkill = primarySkillService.getPrimarySkillById(id); + public ResponseEntity delete(@RequestParam Long pid) { + var primarySkill = primarySkillService.getPrimarySkillByPsid(pid); if (primarySkill.isPresent()) { var secondarySkills = secondarySkillService.getAllSecondarySkills(); for (SecondarySkill secondarySkill : secondarySkills) { - if (secondarySkill.getPrimarySkill().getPsid().equals(id)) { + if (secondarySkill.getPrimarySkill().getPsid().equals(pid)) { secondarySkillService.deleteSecondarySkill(secondarySkill.getSsid()); } } - primarySkillService.deletePrimarySkill(id); + primarySkillService.deletePrimarySkill(pid); return ResponseEntity.noContent().build(); } else { return ResponseEntity.notFound().build(); diff --git a/src/main/java/com/maradona/backend/controllers/api/ProjectController.java b/src/main/java/com/maradona/backend/controllers/api/ProjectController.java index 9520a28..4d6823d 100644 --- a/src/main/java/com/maradona/backend/controllers/api/ProjectController.java +++ b/src/main/java/com/maradona/backend/controllers/api/ProjectController.java @@ -41,13 +41,13 @@ public class ProjectController { /** * Returns a specific project from the database. * - * @param id The ID of the requested project. + * @param psid The ID of the requested project. * @return The project with the requested ID. * @see com.maradona.backend.entities.Project */ @GetMapping({ "/", "" }) - public ResponseEntity get(@RequestParam Long id) { - Optional project = projectService.getProjectById(id); + public ResponseEntity get(@RequestParam Long psid) { + Optional project = projectService.getProjectByPid(psid); return project.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } @@ -63,15 +63,15 @@ public class ProjectController { } /** - * Returns a list of projects for a given user. + * Returns a list of projects for a given employee. * - * @param userId ID of the user + * @param eid ID of the employee * @return list of projects * @see com.maradona.backend.entities.Project */ - @GetMapping("/from-user") - public ResponseEntity> getFromUser(@RequestParam Long userId) { - return ResponseEntity.ok(projectService.getProjectsByUserId(userId)); + @GetMapping("/from-employee") + public ResponseEntity> getFromUser(@RequestParam Long eid) { + return ResponseEntity.ok(projectService.getProjectsByEid(eid)); } /** @@ -103,13 +103,13 @@ public class ProjectController { /** * Deletes a project from the database. * - * @param id The ID of the project to be deleted + * @param pid The ID of the project to be deleted * @return HTTP status indicating the outcome of the operation * @see com.maradona.backend.entities.Project */ @DeleteMapping({ "/", "" }) - public ResponseEntity delete(@RequestParam Long id) { - projectService.deleteProject(id); + public ResponseEntity delete(@RequestParam Long pid) { + projectService.deleteProject(pid); return ResponseEntity.noContent().build(); } } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/controllers/api/SecondarySkillController.java b/src/main/java/com/maradona/backend/controllers/api/SecondarySkillController.java index 78cfc47..26985f6 100644 --- a/src/main/java/com/maradona/backend/controllers/api/SecondarySkillController.java +++ b/src/main/java/com/maradona/backend/controllers/api/SecondarySkillController.java @@ -40,13 +40,13 @@ public class SecondarySkillController { /** * Returns a specific secondary skill from the database. * - * @param id The ID of the requested secondary skill. + * @param ssid The ID of the requested secondary skill. * @return The secondary skill with the requested ID. * @see com.maradona.backend.entities.SecondarySkill */ @GetMapping({ "/", "" }) - public ResponseEntity get(@RequestParam Long id) { - Optional secondarySkill = secondarySkillService.getSecondarySkillById(id); + public ResponseEntity get(@RequestParam Long ssid) { + Optional secondarySkill = secondarySkillService.getSecondarySkillBySsid(ssid); return secondarySkill.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } @@ -64,14 +64,14 @@ public class SecondarySkillController { /** * Returns a list of secondary skills for a given primary skill. * - * @param primarySkillId ID of the primary skill + * @param psid ID of the primary skill * @return list of secondary skills * @see com.maradona.backend.entities.SecondarySkill * @see com.maradona.backend.entities.PrimarySkill */ @GetMapping("/from-primary-skill") - public ResponseEntity> getSecondarySkills(@RequestParam Long primarySkillId) { - return ResponseEntity.ok(secondarySkillService.getSecondarySkillsByPrimarySkillId(primarySkillId)); + public ResponseEntity> getSecondarySkills(@RequestParam Long psid) { + return ResponseEntity.ok(secondarySkillService.getSecondarySkillsByPrimarySkillId(psid)); } /** @@ -103,13 +103,13 @@ public class SecondarySkillController { /** * Deletes a secondary skill from the database. * - * @param id The ID of the secondary skill to be deleted + * @param ssid The ID of the secondary skill to be deleted * @return HTTP status indicating the outcome of the operation * @see com.maradona.backend.entities.SecondarySkill */ @DeleteMapping({ "/", "" }) - public ResponseEntity delete(@RequestParam Long id) { - secondarySkillService.deleteSecondarySkill(id); + public ResponseEntity delete(@RequestParam Long ssid) { + secondarySkillService.deleteSecondarySkill(ssid); return ResponseEntity.noContent().build(); } } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/controllers/page/SkillsPage.java b/src/main/java/com/maradona/backend/controllers/page/SkillsPage.java index 4611268..c92c075 100644 --- a/src/main/java/com/maradona/backend/controllers/page/SkillsPage.java +++ b/src/main/java/com/maradona/backend/controllers/page/SkillsPage.java @@ -52,7 +52,7 @@ public class SkillsPage { */ @GetMapping({ "/", "" }) public String profile(Model model) { - model.addAttribute("employee", employeeService.getEmployeeById(user).orElse(null)); + model.addAttribute("employee", employeeService.getEmployeeByEid(user).orElse(null)); model.addAttribute("skills", skillService.getUserSkills(user)); return "/pages/skills/overview"; } diff --git a/src/main/java/com/maradona/backend/dto/SkillPrototype.java b/src/main/java/com/maradona/backend/dto/SkillPrototype.java index 3fc33dd..0feb9de 100644 --- a/src/main/java/com/maradona/backend/dto/SkillPrototype.java +++ b/src/main/java/com/maradona/backend/dto/SkillPrototype.java @@ -1,24 +1,24 @@ package com.maradona.backend.dto; public class SkillPrototype { - private Long primarySkillId; - private Long secondarySkillId; + private Long psid; + private Long ssid; private Integer level; - public Long getPrimarySkillId() { - return primarySkillId; + public Long getPsid() { + return psid; } - public void setPrimarySkillId(Long primarySkillId) { - this.primarySkillId = primarySkillId; + public void setPsid(Long psid) { + this.psid = psid; } - public Long getSecondarySkillId() { - return secondarySkillId; + public Long getSsid() { + return ssid; } - public void setSecondarySkillId(Long secondarySkillId) { - this.secondarySkillId = secondarySkillId; + public void setSsid(Long ssid) { + this.ssid = ssid; } public Integer getLevel() { diff --git a/src/main/java/com/maradona/backend/entities/Employee.java b/src/main/java/com/maradona/backend/entities/Employee.java index 5d06051..7029b62 100644 --- a/src/main/java/com/maradona/backend/entities/Employee.java +++ b/src/main/java/com/maradona/backend/entities/Employee.java @@ -24,7 +24,7 @@ public class Employee { private String lastName; @ManyToOne - @JoinColumn(name = "AID") + @JoinColumn(name = "FID") private FormOfAddress formOfAddress; private LocalTime dStart; diff --git a/src/main/java/com/maradona/backend/entities/EmployeeSecondarySkill.java b/src/main/java/com/maradona/backend/entities/EmployeeSecondarySkill.java index 5c17779..1cdf4f8 100644 --- a/src/main/java/com/maradona/backend/entities/EmployeeSecondarySkill.java +++ b/src/main/java/com/maradona/backend/entities/EmployeeSecondarySkill.java @@ -9,10 +9,10 @@ import com.fasterxml.jackson.annotation.JsonBackReference; public class EmployeeSecondarySkill { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long essid; @ManyToOne - @JoinColumn(name = "employee_id", nullable = false) + @JoinColumn(name = "employee_eid", nullable = false) @JsonBackReference private Employee employee; @@ -23,12 +23,12 @@ public class EmployeeSecondarySkill { @Column(nullable = false) private Integer level; - public void setId(Long id) { - this.id = id; + public void setEssid(Long essid) { + this.essid = essid; } - public Long getId() { - return id; + public Long getEssid() { + return essid; } public void setEmployee(Employee employee) { diff --git a/src/main/java/com/maradona/backend/entities/FormOfAddress.java b/src/main/java/com/maradona/backend/entities/FormOfAddress.java index c440eaa..3bf7cac 100644 --- a/src/main/java/com/maradona/backend/entities/FormOfAddress.java +++ b/src/main/java/com/maradona/backend/entities/FormOfAddress.java @@ -9,17 +9,17 @@ public class FormOfAddress { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long fid; @Column(nullable = false, length = 50) private String description; - public void setId(Long id) { - this.id = id; + public void setFid(Long fid) { + this.fid = fid; } - public Long getId() { - return id; + public Long getFid() { + return fid; } public void setDescription(String description) { diff --git a/src/main/java/com/maradona/backend/entities/Project.java b/src/main/java/com/maradona/backend/entities/Project.java index 2536b77..c7f92cb 100644 --- a/src/main/java/com/maradona/backend/entities/Project.java +++ b/src/main/java/com/maradona/backend/entities/Project.java @@ -10,7 +10,7 @@ public class Project { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long pid; @Column(nullable = false, length = 255) private String name; @@ -23,6 +23,14 @@ public class Project { @Column(columnDefinition = "TEXT") private String description; + public void setPid(Long pid) { + this.pid = pid; + } + + public Long getPid() { + return pid; + } + public void setName(String name) { this.name = name; } diff --git a/src/main/java/com/maradona/backend/repositories/EmployeeSecondarySkillRepository.java b/src/main/java/com/maradona/backend/repositories/EmployeeSecondarySkillRepository.java index bc8e110..0f4fdbf 100644 --- a/src/main/java/com/maradona/backend/repositories/EmployeeSecondarySkillRepository.java +++ b/src/main/java/com/maradona/backend/repositories/EmployeeSecondarySkillRepository.java @@ -2,8 +2,6 @@ package com.maradona.backend.repositories; import org.springframework.data.repository.CrudRepository; import com.maradona.backend.entities.EmployeeSecondarySkill; -import java.util.List; public interface EmployeeSecondarySkillRepository extends CrudRepository { - List findByEmployeeId(Long employeeId); } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/services/EmployeeService.java b/src/main/java/com/maradona/backend/services/EmployeeService.java index 5d49343..6fcd32c 100644 --- a/src/main/java/com/maradona/backend/services/EmployeeService.java +++ b/src/main/java/com/maradona/backend/services/EmployeeService.java @@ -21,19 +21,19 @@ public class EmployeeService { return employeeRepository.save(employee); } - public Optional getEmployeeById(Long id) { + public Optional getEmployeeByEid(Long eid) { var employees = employeeRepository.findAll(); for (Employee employee : employees) { - if (employee.getEid().equals(id)) { + if (employee.getEid().equals(eid)) { return Optional.of(employee); } } return Optional.empty(); } - public void deleteEmployee(Long id) { + public void deleteEmployee(Long eid) { for (Employee employee : employeeRepository.findAll()) { - if (employee.getEid().equals(id)) { + if (employee.getEid().equals(eid)) { employeeRepository.delete(employee); return; } @@ -44,13 +44,13 @@ public class EmployeeService { return employeeRepository.findAll(); } - public void addSecondarySkillToEmployee(Long userId, SkillPrototype skillPrototype) { - var employee = getEmployeeById(userId).orElseThrow(() -> new RuntimeException("Employee not found")); - var secondarySkill = secondarySkillService.getSecondarySkillById(skillPrototype.getSecondarySkillId()) + public void addSecondarySkillToEmployee(Long eid, SkillPrototype skillPrototype) { + var employee = getEmployeeByEid(eid).orElseThrow(() -> new RuntimeException("Employee not found")); + var secondarySkill = secondarySkillService.getSecondarySkillBySsid(skillPrototype.getSsid()) .orElseThrow(() -> new RuntimeException("Secondary Skill not found")); for (EmployeeSecondarySkill skill : employee.getSecondarySkills()) { - if (skill.getSecondarySkill().getSsid().equals(skillPrototype.getSecondarySkillId())) { + if (skill.getSecondarySkill().getSsid().equals(skillPrototype.getSsid())) { return; } } @@ -63,13 +63,14 @@ public class EmployeeService { saveEmployee(employee); } - public void updateSecondarySkillLevel(Long userId, Long skillId, Integer level) { - var employee = getEmployeeById(userId).orElseThrow(() -> new RuntimeException("Employee not found")); - secondarySkillService.getSecondarySkillById(skillId) + public void updateSecondarySkillLevel(Long eid, Long ssid, Integer level) { + var employee = getEmployeeByEid(eid).orElseThrow(() -> new RuntimeException("Employee not found")); + secondarySkillService.getSecondarySkillBySsid( + ssid) .orElseThrow(() -> new RuntimeException("Secondary Skill not found")); for (EmployeeSecondarySkill skill : employee.getSecondarySkills()) { - if (skill.getSecondarySkill().getSsid().equals(skillId)) { + if (skill.getSecondarySkill().getSsid().equals(ssid)) { skill.setLevel(level); break; } @@ -78,18 +79,19 @@ public class EmployeeService { saveEmployee(employee); } - public void deleteSecondarySkillFromEmployee(Long userId, Long skillId) { - var employee = getEmployeeById(userId).orElseThrow(() -> new RuntimeException("Employee not found")); - secondarySkillService.getSecondarySkillById(skillId) + public void deleteSecondarySkillFromEmployee(Long eid, Long ssid) { + var employee = getEmployeeByEid(eid).orElseThrow(() -> new RuntimeException("Employee not found")); + secondarySkillService.getSecondarySkillBySsid( + ssid) .orElseThrow(() -> new RuntimeException("Secondary Skill not found")); - employee.getSecondarySkills().removeIf(skill -> skill.getSecondarySkill().getSsid().equals(skillId)); + employee.getSecondarySkills().removeIf(skill -> skill.getSecondarySkill().getSsid().equals(ssid)); saveEmployee(employee); } - public Iterable getEmployeesBySecondarySkill(Long skillId, Integer level) { + public Iterable getEmployeesBySecondarySkill(Long ssid, Integer level) { // Implement logic to fetch employees by secondary skill and level - // This is a placeholder implementation + // TODO: This is a placeholder implementation return employeeRepository.findAll(); } } \ No newline at end of file diff --git a/src/main/java/com/maradona/backend/services/FormOfAddressService.java b/src/main/java/com/maradona/backend/services/FormOfAddressService.java index 54075b6..7ac7f5a 100644 --- a/src/main/java/com/maradona/backend/services/FormOfAddressService.java +++ b/src/main/java/com/maradona/backend/services/FormOfAddressService.java @@ -17,25 +17,32 @@ public class FormOfAddressService { return formOfAddressRepository.save(formOfAddress); } - public Optional getFormOfAddressById(Long id) { - return formOfAddressRepository.findById(id); + public Optional getFormOfAddressByFid(Long fid) { + var formOfAddresses = formOfAddressRepository.findAll(); + for (FormOfAddress formOfAddress : formOfAddresses) { + if (formOfAddress.getFid().equals(fid)) { + return Optional.of(formOfAddress); + } + } + return Optional.empty(); } - public void deleteFormOfAddress(Long id) { - formOfAddressRepository.deleteById(id); + public void deleteFormOfAddress(Long fid) { + for (FormOfAddress formOfAddress : formOfAddressRepository.findAll()) { + if (formOfAddress.getFid().equals(fid)) { + formOfAddressRepository.delete(formOfAddress); + return; + } + } } public Iterable getAllFormOfAddresses() { return formOfAddressRepository.findAll(); } - public Long updateFormOfAddress(Long id, String description) { - var formOfAddress = formOfAddressRepository.findById(id).orElse(null); - if (formOfAddress != null) { - formOfAddress.setDescription(description); - formOfAddressRepository.save(formOfAddress); - return id; - } - return null; + public void updateFormOfAddress(Long fid, String description) { + var formOfAddress = getFormOfAddressByFid(fid).orElseThrow(() -> new RuntimeException("Form of Address not found")); + formOfAddress.setDescription(description); + saveFormOfAddress(formOfAddress); } } diff --git a/src/main/java/com/maradona/backend/services/PrimarySkillService.java b/src/main/java/com/maradona/backend/services/PrimarySkillService.java index 0ca21a2..169ad7a 100644 --- a/src/main/java/com/maradona/backend/services/PrimarySkillService.java +++ b/src/main/java/com/maradona/backend/services/PrimarySkillService.java @@ -3,6 +3,7 @@ package com.maradona.backend.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.maradona.backend.entities.PrimarySkill; +import com.maradona.backend.entities.SecondarySkill; import com.maradona.backend.repositories.PrimarySkillRepository; import java.util.Optional; @@ -13,16 +14,36 @@ public class PrimarySkillService { @Autowired private PrimarySkillRepository primarySkillRepository; + @Autowired + private SecondarySkillService secondarySkillRepository; + public PrimarySkill savePrimarySkill(PrimarySkill primarySkill) { return primarySkillRepository.save(primarySkill); } - public Optional getPrimarySkillById(Long id) { - return primarySkillRepository.findById(id); + public Optional getPrimarySkillByPsid(Long psid) { + var primarySkills = primarySkillRepository.findAll(); + for (PrimarySkill primarySkill : primarySkills) { + if (primarySkill.getPsid().equals(psid)) { + return Optional.of(primarySkill); + } + } + return Optional.empty(); } - public void deletePrimarySkill(Long id) { - primarySkillRepository.deleteById(id); + public void deletePrimarySkill(Long psid) { + var primarySkills = primarySkillRepository.findAll(); + var secondarySkills = secondarySkillRepository.getAllSecondarySkills(); + for (SecondarySkill secondarySkill : secondarySkills) { + if (secondarySkill.getPrimarySkill().getPsid().equals(psid)) { + secondarySkillRepository.deleteSecondarySkill(secondarySkill.getSsid()); + } + } + for (PrimarySkill primarySkill : primarySkills) { + if (primarySkill.getPsid().equals(psid)) { + primarySkillRepository.delete(primarySkill); + } + } } public Iterable getAllPrimarySkills() { diff --git a/src/main/java/com/maradona/backend/services/ProjectService.java b/src/main/java/com/maradona/backend/services/ProjectService.java index c9bcb36..4e6280d 100644 --- a/src/main/java/com/maradona/backend/services/ProjectService.java +++ b/src/main/java/com/maradona/backend/services/ProjectService.java @@ -17,19 +17,30 @@ public class ProjectService { return projectRepository.save(project); } - public Optional getProjectById(Long id) { - return projectRepository.findById(id); + public Optional getProjectByPid(Long pid) { + var projects = projectRepository.findAll(); + for (Project project : projects) { + if (project.getPid().equals(pid)) { + return Optional.of(project); + } + } + return Optional.empty(); } - public void deleteProject(Long id) { - projectRepository.deleteById(id); + public void deleteProject(Long pid) { + var projects = projectRepository.findAll(); + for (Project project : projects) { + if (project.getPid().equals(pid)) { + projectRepository.delete(project); + } + } } public Iterable getAllProjects() { return projectRepository.findAll(); } - public Iterable getProjectsByUserId(Long userId) { + public Iterable getProjectsByEid(Long eid) { // TODO: Actually filter by user return projectRepository.findAll(); } diff --git a/src/main/java/com/maradona/backend/services/SecondarySkillService.java b/src/main/java/com/maradona/backend/services/SecondarySkillService.java index e08d48b..07df7eb 100644 --- a/src/main/java/com/maradona/backend/services/SecondarySkillService.java +++ b/src/main/java/com/maradona/backend/services/SecondarySkillService.java @@ -28,23 +28,29 @@ public class SecondarySkillService { return secondarySkillRepository.save(secondarySkill); } - public Optional getSecondarySkillById(Long id) { - return secondarySkillRepository.findById(id); + public Optional getSecondarySkillBySsid(Long ssid) { + var secondarySkills = secondarySkillRepository.findAll(); + for (SecondarySkill secondarySkill : secondarySkills) { + if (secondarySkill.getSsid().equals(ssid)) { + return Optional.of(secondarySkill); + } + } + return Optional.empty(); } - public void deleteSecondarySkill(Long id) { - secondarySkillRepository.deleteById(id); + public void deleteSecondarySkill(Long ssid) { + secondarySkillRepository.deleteById(ssid); } public Iterable getAllSecondarySkills() { return secondarySkillRepository.findAll(); } - public Iterable getSecondarySkillsByPrimarySkillId(Long primarySkillId) { + public Iterable getSecondarySkillsByPrimarySkillId(Long psid) { var skills = secondarySkillRepository.findAll(); var result = new java.util.ArrayList(); for (SecondarySkill skill : skills) { - if (skill.getPrimarySkill().getPsid().equals(primarySkillId)) { + if (skill.getPrimarySkill().getPsid().equals(psid)) { result.add(skill); System.out.println(skill.getDescription()); } diff --git a/src/main/java/com/maradona/backend/services/SkillService.java b/src/main/java/com/maradona/backend/services/SkillService.java index b8d7162..b3a6a4b 100644 --- a/src/main/java/com/maradona/backend/services/SkillService.java +++ b/src/main/java/com/maradona/backend/services/SkillService.java @@ -4,9 +4,6 @@ import com.maradona.backend.dto.SkillList; import com.maradona.backend.entities.Employee; import com.maradona.backend.entities.PrimarySkill; import com.maradona.backend.entities.SecondarySkill; -import com.maradona.backend.repositories.EmployeeRepository; -import com.maradona.backend.repositories.PrimarySkillRepository; -import com.maradona.backend.repositories.SecondarySkillRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.data.util.Pair; @@ -19,24 +16,24 @@ import java.util.Map; public class SkillService { @Autowired - private PrimarySkillRepository primarySkillRepository; + private PrimarySkillService primarySkillService; @Autowired - private SecondarySkillRepository secondarySkillRepository; + private SecondarySkillService secondarySkillService; @Autowired - private EmployeeRepository employeeRepository; + private EmployeeService employeeService; public Iterable getAllSkills() { - Iterable primarySkills = primarySkillRepository.findAll(); - Iterable secondarySkills = secondarySkillRepository.findAll(); + Iterable primarySkills = primarySkillService.getAllPrimarySkills(); + Iterable secondarySkills = secondarySkillService.getAllSecondarySkills(); List skills = new ArrayList<>(); for (PrimarySkill primarySkill : primarySkills) { List> secondarySkillList = new ArrayList<>(); for (SecondarySkill secondarySkill : secondarySkills) { if (secondarySkill.getPrimarySkill().getPsid().equals(primarySkill.getPsid())) { - secondarySkillList.add(Pair.of(secondarySkill, 3)); // Placeholder level + secondarySkillList.add(Pair.of(secondarySkill, 3)); } } skills.add(new SkillList(primarySkill, secondarySkillList)); @@ -44,11 +41,11 @@ public class SkillService { return skills; } - public Iterable getUserSkills(Long userId) { - if (userId == null) { + public Iterable getUserSkills(Long eid) { + if (eid == null) { return new ArrayList<>(); } - Employee employee = employeeRepository.findById(userId).orElse(null); + Employee employee = employeeService.getEmployeeByEid(eid).orElse(null); if (employee == null) { return new ArrayList<>(); } @@ -56,7 +53,7 @@ public class SkillService { Map secondarySkillLevels = employee.getSecondarySkillLevels(); List skills = new ArrayList<>(); - for (PrimarySkill primarySkill : primarySkillRepository.findAll()) { + for (PrimarySkill primarySkill : primarySkillService.getAllPrimarySkills()) { List> secondarySkillList = new ArrayList<>(); for (Map.Entry entry : secondarySkillLevels.entrySet()) { if (entry.getKey().getPrimarySkill().getPsid().equals(primarySkill.getPsid())) { diff --git a/src/main/resources/config/application.yaml b/src/main/resources/config/application.yaml index ae2e076..1c11ed0 100644 --- a/src/main/resources/config/application.yaml +++ b/src/main/resources/config/application.yaml @@ -26,7 +26,7 @@ spring: prefix: "classpath:/templates/" # Path where Thymeleaf templates are stored suffix: ".html" # File extension for Thymeleaf templates cache: false # Disable caching for development (set to true in production) - mode: "HTML5" # Template mode; Thymeleaf parses the templates as HTML5 + mode: "HTML" # Template mode; Thymeleaf parses the templates as HTML5 encoding: "UTF-8" # Character encoding for the templates servlet: content-type: "text/html" # Content type for the Thymeleaf-rendered HTML responses diff --git a/src/main/resources/static/css/core/alerts.css b/src/main/resources/static/css/core/alerts.css new file mode 100644 index 0000000..86992c9 --- /dev/null +++ b/src/main/resources/static/css/core/alerts.css @@ -0,0 +1,57 @@ +.alert { + padding: 15px; + margin-top: 10px; + border-radius: 4px; + font-size: 14px; + font-weight: 500; + color: var(--cosmic-dark-darker); + display: inline-block; + max-width: 100%; + animation: fadeInOut 5s ease-in-out; + opacity: 0; + transition: opacity 0.3s ease-in-out; +} + +.alert.show { + opacity: 1; +} + +/* Alert types */ +.alert-info { + background-color: #17a2b8; + border: 1px solid #17a2b8; +} + +.alert-error { + background-color: var(--aurora-yellowgreen-lighter); + border: 1px solid var(--aurora-yellowgreen-lighter); +} + +.alert-success { + background-color: #28a745; + border: 1px solid #28a745; +} + +/* Fade animation */ +@keyframes fadeInOut { + 0%, + 100% { + opacity: 0; + } + 10%, + 90% { + opacity: 1; + } +} + +/* Additional styling for improved visibility */ +.alert-icon { + margin-right: 8px; + font-size: 16px; + vertical-align: middle; +} + +/* Additional spacing */ +.mt-2 { + margin-top: 10px; +} diff --git a/src/main/resources/static/css/skills/skills.css b/src/main/resources/static/css/skills/skills.css index 4ff712b..1ef0b6b 100644 --- a/src/main/resources/static/css/skills/skills.css +++ b/src/main/resources/static/css/skills/skills.css @@ -65,11 +65,3 @@ .form-control::placeholder { color: var(--cosmic-dark-dark); } - -.star-filled { - color: var(--aurora-yellowgreen-lighter); -} - -.star-empty { - color: var(--cosmic-dark-light) !important; -} diff --git a/src/main/resources/static/css/skills/starRating.css b/src/main/resources/static/css/skills/starRating.css new file mode 100644 index 0000000..c6d23c5 --- /dev/null +++ b/src/main/resources/static/css/skills/starRating.css @@ -0,0 +1,85 @@ +.star-rating-container { + display: inline-block; + position: relative; + min-width: 300px; +} + +.star-rating { + display: inline-block; +} + +.star { + font-size: 24px; + cursor: pointer; + transition: all 0.2s ease; +} + +.star i { + color: transparent; + -webkit-text-stroke: 1.5px var(--aurora-yellowgreen-lighter); +} + +.star.active i { + color: var(--aurora-yellowgreen-lighter); + -webkit-text-stroke: 1px var(--aurora-yellowgreen-lighter); +} + +.star:hover i { + color: var(--aurora-yellowgreen-lighter); + -webkit-text-stroke: 1px var(--aurora-yellowgreen-lighter); +} + +.rating-description { + position: absolute; + top: 100%; + left: 0; + min-width: 300px; + width: max-content; + max-width: 400px; + margin-top: 8px; + padding: 10px 15px; + background-color: var(--starlight-white-lighter); + border: 1px solid var(--starlight-white-dark); + border-radius: 4px; + font-size: 14px; + line-height: 1.5; + color: var(--cosmic-dark-medium); + opacity: 0; + visibility: hidden; + transition: opacity 0.2s, visibility 0.2s; + z-index: 1000; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.rating-description.visible { + opacity: 1; + visibility: visible; +} + +.star + .star { + margin-left: 4px; +} + +.form-group label + .star-rating-container { + margin-left: 8px; + margin-bottom: 40px; +} + +.form-group input[type="hidden"] { + display: none; +} + +@media (max-width: 768px) { + .rating-description { + position: relative; + width: 100%; + max-width: none; + margin-top: 8px; + } + + .form-group label + .star-rating-container { + margin-left: 0; + display: block; + margin-top: 8px; + } +} diff --git a/src/main/resources/static/js/skills/fetchSecondarySkills.js b/src/main/resources/static/js/skills/fetchSecondarySkills.js index 57d786d..2b30f59 100644 --- a/src/main/resources/static/js/skills/fetchSecondarySkills.js +++ b/src/main/resources/static/js/skills/fetchSecondarySkills.js @@ -1,18 +1,175 @@ -document.getElementById("primarySkill").addEventListener("change", function () { - var primarySkillId = this.value; - fetch("/skills/secondary-skills?primarySkillId=" + primarySkillId) - .then((response) => response.json()) - .then((data) => { - console.log("Fetch response data:", data); - var secondarySkillSelect = document.getElementById("secondarySkill"); - secondarySkillSelect.innerHTML = - ''; - data.forEach(function (secondarySkill) { - var option = document.createElement("option"); - option.value = secondarySkill.ssid; - option.text = secondarySkill.description; - secondarySkillSelect.add(option); - }); - }) - .catch((error) => console.error("Error fetching secondary skills:", error)); -}); +/** + * @fileoverview Handles the dynamic population of secondary skills dropdown based on primary skill selection + * @version 4.1.0 + */ + +/** + * @typedef {Object} SecondarySkill + * @property {number} ssid - The secondary skill ID + * @property {string} description - The description of the secondary skill + */ + +/** + * Creates and returns an option element for the select dropdown + * @param {string} text - The text to display in the option + * @param {boolean} [disabled=false] - Whether the option should be disabled + * @param {boolean} [selected=false] - Whether the option should be selected + * @param {string|number} [value=""] - The value for the option + * @returns {HTMLOptionElement} The created option element + */ +function createOption(text, disabled = false, selected = false, value = "") { + const option = document.createElement("option"); + option.textContent = text; + option.disabled = disabled; + option.selected = selected; + option.value = value; + return option; +} + +/** + * Shows a temporary message below the secondary skills dropdown + * @param {string} message - The message to display + * @param {string} type - The type of alert (info, error, success, etc.) + * @param {number} [duration=5000] - How long to show the message in milliseconds + * @param {HTMLElement} container - The element to append the message to + */ +function showTemporaryMessage(message, type, duration = 5000, container) { + const messageElement = document.createElement("div"); + messageElement.className = `alert alert-${type} mt-2`; + messageElement.textContent = message; + container.appendChild(messageElement); + + setTimeout(() => { + messageElement.classList.add("show"); + }, 10); + + setTimeout(() => { + messageElement.classList.remove("show"); + setTimeout(() => { + if (messageElement.parentNode) { + messageElement.parentNode.removeChild(messageElement); + } + }); + }, duration); +} + +/** + * Updates the secondary skills dropdown based on the API response + * @param {SecondarySkill[]} secondarySkills - Array of secondary skills from the API + * @param {HTMLSelectElement} selectElement - The secondary skills select element + */ +function updateSecondarySkillsDropdown(secondarySkills, selectElement) { + selectElement.innerHTML = ""; // Clear existing options + + if (!secondarySkills || secondarySkills.length === 0) { + selectElement.appendChild( + createOption("No secondary skills available", true, true) + ); + selectElement.disabled = true; + + showTemporaryMessage( + "There are no secondary skills available for this primary skill. Please contact an administrator to add some.", + "info", + 5000, + selectElement.parentNode + ); + return; + } + + selectElement.appendChild( + createOption("Select a secondary skill", true, true) + ); + + secondarySkills.forEach((skill) => { + selectElement.appendChild( + createOption(skill.description, false, false, skill.ssid) + ); + }); + + selectElement.disabled = false; +} + +/** + * Initializes the event listeners and handlers for the skills dropdowns + * This is the main function that sets up all the functionality + */ +function initializeSkillsDropdowns() { + const primarySkillSelect = document.getElementById("primarySkill"); + const secondarySkillSelect = document.getElementById("secondarySkill"); + + if (!primarySkillSelect || !secondarySkillSelect) { + console.error("Required select elements not found"); + return; + } + + secondarySkillSelect.disabled = true; + + primarySkillSelect.addEventListener("change", async function () { + const selectedPrimarySkillId = this.value; + secondarySkillSelect.innerHTML = ""; + secondarySkillSelect.appendChild( + createOption("Select a secondary skill", true, true) + ); + + if (!selectedPrimarySkillId) { + secondarySkillSelect.disabled = true; + return; + } + + secondarySkillSelect.innerHTML = ""; + secondarySkillSelect.appendChild(createOption("Loading...", true, true)); + + try { + const response = await fetch( + `/api/skills/secondary/${selectedPrimarySkillId}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + + if (!response.ok) { + const errorMessage = `Server returned ${response.status}: ${response.statusText}`; + throw new Error(errorMessage); + } + + const secondarySkills = await response.json(); + updateSecondarySkillsDropdown(secondarySkills, secondarySkillSelect); + } catch (error) { + console.error("Error fetching secondary skills:", error); + secondarySkillSelect.innerHTML = ""; + secondarySkillSelect.appendChild( + createOption("Error loading secondary skills", true, true) + ); + secondarySkillSelect.disabled = true; + + let userMessage = ""; + if (error.name === "TypeError" && !window.navigator.onLine) { + userMessage = + "No internet connection. Please check your network and try again."; + } else if (error.message.includes("Server returned 404")) { + userMessage = + "The selected primary skill was not found. Please refresh and try again."; + } else if (error.message.includes("Server returned 500")) { + userMessage = + "Server error occurred. Please try again in a few minutes."; + } else if (error.message.includes("Server returned 403")) { + userMessage = + "You don't have permission to access these skills. Please contact support."; + } else { + userMessage = `Failed to load secondary skills: ${error.message}`; + } + + showTemporaryMessage( + userMessage, + "error", + 5000, + secondarySkillSelect.parentNode + ); + } + }); +} + +document.addEventListener("DOMContentLoaded", initializeSkillsDropdowns); diff --git a/src/main/resources/static/js/skills/starRating.js b/src/main/resources/static/js/skills/starRating.js new file mode 100644 index 0000000..f847bed --- /dev/null +++ b/src/main/resources/static/js/skills/starRating.js @@ -0,0 +1,103 @@ +/*** + * @fileoverview Star Rating Component - Initializes and manages an interactive star rating system + * with hover effects, click handling, and dynamic descriptions. + * @version 2.2.0 + */ +document.addEventListener("DOMContentLoaded", function () { + const stars = document.querySelectorAll(".star"); + const ratingInput = document.getElementById("level"); + const descriptionElement = document.querySelector(".rating-description"); + const initialValue = parseInt(ratingInput.value) || 0; + updateStars(initialValue); + + stars.forEach((star) => { + /** + * Handle click events on stars + * Updates the rating value and displays the corresponding description + */ + star.addEventListener("click", function () { + const value = parseInt(this.dataset.value); + ratingInput.value = value; + updateStars(value); + showDescription(this.dataset.description); + }); + + /** + * Handle mouseenter events on stars + * Temporarily highlights stars and shows description on hover + */ + star.addEventListener("mouseenter", function () { + const value = parseInt(this.dataset.value); + highlightStars(value); + showDescription(this.dataset.description); + }); + }); + + /** + * Handle mouseleave events on the entire star rating container + * Resets the display to the current selected rating + */ + document + .querySelector(".star-rating") + .addEventListener("mouseleave", function () { + const currentValue = parseInt(ratingInput.value) || 0; + updateStars(currentValue); + if (currentValue > 0) { + const selectedStar = document.querySelector( + `.star[data-value="${currentValue}"]` + ); + showDescription(selectedStar.dataset.description); + } else { + hideDescription(); + } + }); + + /** + * Updates the visual state of stars based on a value + * @param {number} value - The rating value to display (1-5) + */ + function updateStars(value) { + stars.forEach((star) => { + const starValue = parseInt(star.dataset.value); + if (starValue <= value) { + star.classList.add("active"); + } else { + star.classList.remove("active"); + } + }); + } + + /** + * Temporarily highlights stars up to a specific value + * Used for hover effects + * @param {number} value - The rating value to highlight (1-5) + */ + function highlightStars(value) { + stars.forEach((star) => { + const starValue = parseInt(star.dataset.value); + if (starValue <= value) { + star.classList.add("active"); + } else { + star.classList.remove("active"); + } + }); + } + + /** + * Displays a description for the current rating + * @param {string} description - The description text to display + */ + function showDescription(description) { + if (description) { + descriptionElement.textContent = description; + descriptionElement.classList.add("visible"); + } + } + + /** + * Hides the rating description + */ + function hideDescription() { + descriptionElement.classList.remove("visible"); + } +}); diff --git a/src/main/resources/templates/pages/skills/add.html b/src/main/resources/templates/pages/skills/add.html index cd08989..1b4088b 100644 --- a/src/main/resources/templates/pages/skills/add.html +++ b/src/main/resources/templates/pages/skills/add.html @@ -1,16 +1,22 @@ -
+ Add Skill + + +
-
+

Add Skill

-
@@ -54,25 +59,52 @@
- - +
- - - - - + value="1" + />
-
@@ -81,5 +113,6 @@
+ diff --git a/src/main/resources/templates/pages/skills/create.html b/src/main/resources/templates/pages/skills/create.html index 13a5716..62ebf2a 100644 --- a/src/main/resources/templates/pages/skills/create.html +++ b/src/main/resources/templates/pages/skills/create.html @@ -1,7 +1,7 @@ -
+ Create Skill