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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 6 additions & 28 deletions backend/src/main/java/app/training/Training.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

import app.business.BusinessPerson;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down Expand Up @@ -50,18 +49,12 @@ public class Training {
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

// -------------------- Constructors --------------------

public Training() {
this.createdAt = LocalDateTime.now();
}

public Training(
String trainingName,
String description,
LocalDate completionDate,
LocalDate expiryDate,
boolean required) {
public Training(String trainingName, String description, LocalDate completionDate,
LocalDate expiryDate, boolean required) {
this.trainingName = trainingName;
this.description = description;
this.completionDate = completionDate;
Expand All @@ -77,8 +70,6 @@ protected void onCreate() {
}
}

// -------------------- Business Logic --------------------

/**
* Check if the training is completed. A training is considered completed if completionDate is not
* null.
Expand All @@ -101,8 +92,6 @@ public long getRemainingDays() {
return ChronoUnit.DAYS.between(LocalDate.now(), expiryDate);
}

// -------------------- Getters / Setters --------------------

public Long getId() {
return id;
}
Expand Down Expand Up @@ -165,20 +154,9 @@ public LocalDateTime getCreatedAt() {

@Override
public String toString() {
return "Training{"
+ "id="
+ id
+ ", trainingName='"
+ trainingName
+ '\''
+ ", personType="
+ (person != null ? person.getPersonType() : "null")
+ ", personName="
+ (person != null ? person.getName() : "null")
+ ", required="
+ required
+ ", expired="
+ isExpired()
+ '}';
return "Training{" + "id=" + id + ", trainingName='" + trainingName + '\'' + ", personType="
+ (person != null ? person.getPersonType() : "null") + ", personName="
+ (person != null ? person.getName() : "null") + ", required=" + required + ", expired="
+ isExpired() + '}';
}
}
77 changes: 20 additions & 57 deletions backend/src/main/java/app/training/TrainingServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package app.training;

import java.util.List;
import java.util.stream.Collectors;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import app.business.BusinessPerson;
import app.business.BusinessPersonRepository;
import app.common.exception.ResourceNotFoundException;
Expand All @@ -20,31 +17,25 @@ public class TrainingServiceImpl implements TrainingService {
private final TrainingRepository trainingRepository;
private final BusinessPersonRepository businessPersonRepository;

public TrainingServiceImpl(
TrainingRepository trainingRepository, BusinessPersonRepository businessPersonRepository) {
public TrainingServiceImpl(TrainingRepository trainingRepository,
BusinessPersonRepository businessPersonRepository) {
this.trainingRepository = trainingRepository;
this.businessPersonRepository = businessPersonRepository;
}

@Override
public TrainingDTO addTraining(Long personId, CreateTrainingRequest request) {
BusinessPerson person =
businessPersonRepository
.findById(personId)
.orElseThrow(() -> new ResourceNotFoundException("Person", "id", personId));
BusinessPerson person = businessPersonRepository.findById(personId)
.orElseThrow(() -> new ResourceNotFoundException("Person", "id", personId));
Training training = createTrainingFromRequest(request);
training.setPerson(person);
Training saved = trainingRepository.save(training);
return convertToDTO(saved);
}

private Training createTrainingFromRequest(CreateTrainingRequest request) {
return new Training(
request.trainingName(),
request.description(),
request.completionDate(),
request.expiryDate(),
request.required());
return new Training(request.trainingName(), request.description(), request.completionDate(),
request.expiryDate(), request.required());
}

@Override
Expand All @@ -54,9 +45,7 @@ public List<TrainingDTO> getTrainingsByPerson(Long personId) {
throw new ResourceNotFoundException("Person", "id", personId);
}

return trainingRepository.findByPersonId(personId).stream()
.map(this::convertToDTO)
.collect(Collectors.toList());
return trainingRepository.findByPersonId(personId).stream().map(this::convertToDTO).toList();
}

@Override
Expand All @@ -66,28 +55,22 @@ public List<TrainingDTO> getExpiredTrainings(Long personId) {
throw new ResourceNotFoundException("Person", "id", personId);
}

return trainingRepository.findByPersonId(personId).stream()
.filter(Training::isExpired)
.map(this::convertToDTO)
.collect(Collectors.toList());
return trainingRepository.findByPersonId(personId).stream().filter(Training::isExpired)
.map(this::convertToDTO).toList();
}

@Override
@Transactional(readOnly = true)
public TrainingDTO getTrainingById(Long trainingId) {
Training training =
trainingRepository
.findById(trainingId)
.orElseThrow(() -> new ResourceNotFoundException("Training", "id", trainingId));
Training training = trainingRepository.findById(trainingId)
.orElseThrow(() -> new ResourceNotFoundException("Training", "id", trainingId));
return convertToDTO(training);
}

@Override
public TrainingDTO updateTraining(Long trainingId, UpdateTrainingRequest request) {
Training training =
trainingRepository
.findById(trainingId)
.orElseThrow(() -> new ResourceNotFoundException("Training", "id", trainingId));
Training training = trainingRepository.findById(trainingId)
.orElseThrow(() -> new ResourceNotFoundException("Training", "id", trainingId));
if (request.trainingName() != null) {
training.setTrainingName(request.trainingName());
}
Expand Down Expand Up @@ -120,38 +103,18 @@ public void deleteTraining(Long trainingId) {
@Override
@Transactional(readOnly = true)
public List<TrainingDTO> getAllTrainings() {
return trainingRepository.findAll().stream()
.map(this::convertToDTO)
.collect(Collectors.toList());
}

// -------------------- Helper Methods --------------------

private Training createTrainingFromDTO(TrainingDTO dto) {
return new Training(
dto.getTrainingName(),
dto.getDescription(),
dto.getCompletionDate(),
dto.getExpiryDate(),
dto.isRequired());
return trainingRepository.findAll().stream().map(this::convertToDTO).toList();
}

private TrainingDTO convertToDTO(Training training) {
TrainingDTO.Builder builder =
TrainingDTO.builder()
.withId(training.getId())
.withTrainingName(training.getTrainingName())
.withDescription(training.getDescription())
.withCompletionDate(training.getCompletionDate())
.withExpiryDate(training.getExpiryDate())
.withRequired(training.isRequired())
.withCompleted(training.isCompleted())
.withExpired(training.isExpired())
.withCreatedAt(training.getCreatedAt());
TrainingDTO.Builder builder = TrainingDTO.builder().withId(training.getId())
.withTrainingName(training.getTrainingName()).withDescription(training.getDescription())
.withCompletionDate(training.getCompletionDate()).withExpiryDate(training.getExpiryDate())
.withRequired(training.isRequired()).withCompleted(training.isCompleted())
.withExpired(training.isExpired()).withCreatedAt(training.getCreatedAt());

if (training.getPerson() != null) {
builder
.withPersonId(training.getPerson().getId())
builder.withPersonId(training.getPerson().getId())
.withPersonName(training.getPerson().getName())
.withPersonType(training.getPerson().getPersonType());
}
Expand Down
22 changes: 11 additions & 11 deletions frontend/src/api/businesses.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import api from "./axios";
import type {
Company,
CreateBusinessRequest,
UpdateBusinessRequest
import type {
Company,
CreateBusinessRequest,
UpdateBusinessRequest,
} from "../types/business";

export const createBusiness = (data: CreateBusinessRequest) =>
export const createBusiness = (data: CreateBusinessRequest) =>
api.post<Company>("/api/businesses", data);

export const getBusiness = (id: number) =>
export const getBusiness = (id: number) =>
api.get<Company>(`/api/businesses/${id}`);

export const getAllBusinesses = () =>
api.get<Company[]>("/api/businesses");
export const getAllBusinesses = () => api.get<Company[]>("/api/businesses");

export const updateBusiness = (id: number, data: UpdateBusinessRequest) =>
export const updateBusiness = (id: number, data: UpdateBusinessRequest) =>
api.put<Company>(`/api/businesses/${id}`, data);

export const deleteBusiness = (id: number) =>
api.delete(`/api/businesses/${id}`);
export const deleteBusiness = (id: number) =>
api.delete(`/api/businesses/${id}`);

29 changes: 14 additions & 15 deletions frontend/src/api/employees.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,31 @@
import api from "./axios";
import type {
Employee,
CreateEmployeeRequest,
UpdateEmployeeRequest
import type {
Employee,
CreateEmployeeRequest,
UpdateEmployeeRequest,
} from "../types/employee";

export const createEmployee = (data: CreateEmployeeRequest) =>
export const createEmployee = (data: CreateEmployeeRequest) =>
api.post<Employee>("/api/employees", data);

export const getEmployee = (id: number) =>
export const getEmployee = (id: number) =>
api.get<Employee>(`/api/employees/${id}`);

export const getAllEmployees = () =>
api.get<Employee[]>("/api/employees");
export const getAllEmployees = () => api.get<Employee[]>("/api/employees");

export const updateEmployee = (id: number, data: UpdateEmployeeRequest) =>
export const updateEmployee = (id: number, data: UpdateEmployeeRequest) =>
api.put<Employee>(`/api/employees/${id}`, data);

export const deleteEmployee = (id: number) =>
export const deleteEmployee = (id: number) =>
api.delete(`/api/employees/${id}`);

export const getEmployeesByBusiness = (businessId: number) =>
export const getEmployeesByBusiness = (businessId: number) =>
api.get<Employee[]>(`/api/employees/business/${businessId}`);

export const getEmployeesByManager = (managerId: number) =>
export const getEmployeesByManager = (managerId: number) =>
api.get<Employee[]>(`/api/employees/manager/${managerId}`);

export const assignManager = (id: number, managerId: number) =>
export const assignManager = (id: number, managerId: number) =>
api.put<Employee>(`/api/employees/${id}/manager`, null, {
params: { managerId }
});
params: { managerId },
});
Loading
Loading