Commit 84afc748 authored by Heber Cordova's avatar Heber Cordova

feat: added passenger and agent endpoints

parent f781d1e6
......@@ -9,5 +9,4 @@ public class FlightAgencyApiApplication {
public static void main(String[] args) {
SpringApplication.run(FlightAgencyApiApplication.class, args);
}
}
package com.hcordova.flightagencyapi.agent.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.agent.domain.services.AgentService;
import com.hcordova.flightagencyapi.agent.dto.AgentAllDTO;
import com.hcordova.flightagencyapi.agent.dto.AgentByDTO;
import com.hcordova.flightagencyapi.agent.dto.AgentEditDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/agents")
@RequiredArgsConstructor
public class AgentController {
private final AgentService agentService;
@GetMapping()
public ResponseEntity<List<AgentAllDTO>> getAll() {
return ResponseEntity.ok(agentService.getAll().stream().map(agent -> {
return new AgentAllDTO(agent);
}).toList());
}
@GetMapping("{id}")
public ResponseEntity<AgentByDTO> getById(@PathVariable() Long id) {
return ResponseEntity.ok(new AgentByDTO(agentService.getById(id)));
}
@PutMapping("{id}")
public ResponseEntity<AgentByDTO> edit(@PathVariable Long id, @RequestBody() AgentEditDTO editDTO) {
return ResponseEntity.ok(new AgentByDTO(agentService.edit(editDTO, id)));
}
@DeleteMapping("{id}")
public ResponseEntity<AgentByDTO> delete(@PathVariable Long id) {
return ResponseEntity.ok(new AgentByDTO(agentService.delete(id)));
}
}
package com.hcordova.flightagencyapi.agent.domain.models;
import java.time.LocalDate;
import com.hcordova.flightagencyapi.shared.domain.models.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "agents")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Agent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String details;
@OneToOne()
private User user;
@Column(nullable = false)
@Temporal(TemporalType.DATE)
private LocalDate createdAt;
@Column(nullable = true)
@Temporal(TemporalType.DATE)
private LocalDate deletedAt;
}
package com.hcordova.flightagencyapi.agent.domain.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
@Repository
public interface AgentRepository extends JpaRepository<Agent, Long>{
Optional<Agent> findByUserId(Long userId);
}
package com.hcordova.flightagencyapi.agent.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
import com.hcordova.flightagencyapi.agent.dto.AgentEditDTO;
public interface AgentService {
List<Agent> getAll();
Agent getById(Long id);
Agent edit(AgentEditDTO agent, Long id);
Agent delete(Long id);
}
package com.hcordova.flightagencyapi.agent.dto;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AgentAllDTO {
private Long id;
private String name;
private String lastname;
private String details;
public AgentAllDTO(Agent agent) {
this.id = agent.getId();
this.name = agent.getUser().getName();
this.lastname = agent.getUser().getLastname();
this.details = agent.getDetails();
}
}
package com.hcordova.flightagencyapi.agent.dto;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AgentByDTO {
private Long id;
private String name;
private String lastname;
private String details;
private String email;
public AgentByDTO(Agent agent) {
this.id = agent.getId();
this.name = agent.getUser().getName();
this.lastname = agent.getUser().getLastname();
this.details = agent.getDetails();
this.email = agent.getUser().getEmail();
}
}
package com.hcordova.flightagencyapi.agent.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AgentEditDTO {
private Long id;
private String name;
private String lastname;
private String details;
public AgentEditDTO(Long id, String name, String lastname, String details) {
this.id = id;
this.name = name;
this.lastname = lastname;
this.details = details;
}
}
package com.hcordova.flightagencyapi.agent.services;
import java.time.LocalDate;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
import com.hcordova.flightagencyapi.agent.domain.repositories.AgentRepository;
import com.hcordova.flightagencyapi.agent.domain.services.AgentService;
import com.hcordova.flightagencyapi.agent.dto.AgentEditDTO;
import com.hcordova.flightagencyapi.shared.exceptions.NotFoundException;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class AgentServiceImpl implements AgentService {
private final AgentRepository agentRepository;
@Override
public List<Agent> getAll() {
return agentRepository.findAll();
}
@Override
public Agent getById(Long id) {
return agentRepository.findById(id)
.orElseThrow(() -> new NotFoundException("Agent not found"));
}
@Override
public Agent edit(AgentEditDTO agent, Long id) {
Agent agentToEdit = getById(id);
agentToEdit.setDetails(agent.getDetails());
return agentRepository.save(agentToEdit);
}
@Override
public Agent delete(Long id) {
Agent agent = getById(id);
agent.setDeletedAt(LocalDate.now());
return agentRepository.save(agent);
}
}
package com.hcordova.flightagencyapi.aircraft.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.aircraft.domain.services.AircraftService;
import com.hcordova.flightagencyapi.aircraft.dto.AircraftDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/aircrafts")
@RequiredArgsConstructor
public class AircraftController {
private final AircraftService aircraftService;
@GetMapping
public ResponseEntity<List<AircraftDTO>> getAll() {
return ResponseEntity.ok(this.aircraftService.getAll().stream().map(aircraft -> {
return new AircraftDTO(aircraft);
}).toList());
}
}
package com.hcordova.flightagencyapi.aircraft.domain.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "aircrafts")
@Getter
@Setter
public class Aircraft {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
@Column(nullable = false, length = 30)
private String manufacturer;
@Column(nullable = false, length = 30)
private String model;
}
package com.hcordova.flightagencyapi.aircraft.domain.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.aircraft.domain.models.Aircraft;
@Repository
public interface AircraftRepository extends JpaRepository<Aircraft, Long> {
}
package com.hcordova.flightagencyapi.aircraft.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.aircraft.domain.models.Aircraft;
public interface AircraftService {
List<Aircraft> getAll();
}
package com.hcordova.flightagencyapi.aircraft.dto;
import com.hcordova.flightagencyapi.aircraft.domain.models.Aircraft;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AircraftDTO {
private Long id;
private String name;
private String manufacturer;
private String model;
public AircraftDTO(Aircraft aircraft) {
this.id = aircraft.getId();
this.name = aircraft.getName();
this.manufacturer = aircraft.getManufacturer();
this.model = aircraft.getModel();
}
}
package com.hcordova.flightagencyapi.aircraft.services;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.aircraft.domain.models.Aircraft;
import com.hcordova.flightagencyapi.aircraft.domain.repositories.AircraftRepository;
import com.hcordova.flightagencyapi.aircraft.domain.services.AircraftService;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class AircraftServiceImpl implements AircraftService {
private final AircraftRepository aircraftRepository;
@Override
public List<Aircraft> getAll() {
return aircraftRepository.findAll();
}
}
package com.hcordova.flightagencyapi.airline.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.airline.domain.services.AirlineService;
import com.hcordova.flightagencyapi.airline.dto.AirlineDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/airlines")
@RequiredArgsConstructor
public class AirlineController {
private final AirlineService airlineService;
@GetMapping
public ResponseEntity<List<AirlineDTO>> getAll() {
return ResponseEntity.ok(this.airlineService.getAll().stream().map(airline -> {
return new AirlineDTO(airline);
}).toList());
}
}
package com.hcordova.flightagencyapi.airline.domain.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "airlines")
@Getter
@Setter
@AllArgsConstructor
public class Airline {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
@Column(nullable = false, length = 2)
private String code;
}
package com.hcordova.flightagencyapi.airline.domain.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.airline.domain.models.Airline;
@Repository
public interface AirlineRepository extends JpaRepository<Airline, Long>{
}
package com.hcordova.flightagencyapi.airline.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.airline.domain.models.Airline;
public interface AirlineService {
List<Airline> getAll();
}
package com.hcordova.flightagencyapi.airline.dto;
import com.hcordova.flightagencyapi.airline.domain.models.Airline;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AirlineDTO {
private Long id;
private String name;
private String code;
public AirlineDTO(Airline airline) {
this.id = airline.getId();
this.name = airline.getName();
this.code = airline.getCode();
}
}
package com.hcordova.flightagencyapi.airline.services;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.airline.domain.models.Airline;
import com.hcordova.flightagencyapi.airline.domain.repositories.AirlineRepository;
import com.hcordova.flightagencyapi.airline.domain.services.AirlineService;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class AirlineServiceImpl implements AirlineService{
private final AirlineRepository airlineRepository;
@Override
public List<Airline> getAll() {
return this.airlineRepository.findAll();
}
}
package com.hcordova.flightagencyapi.airport.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.airport.domain.services.AirportService;
import com.hcordova.flightagencyapi.airport.dto.AirportDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/airports")
@RequiredArgsConstructor
public class AirportController {
private final AirportService airportService;
@GetMapping()
public ResponseEntity<List<AirportDTO>> getAll() {
return ResponseEntity.ok(airportService.getAll().stream().map(airport -> {
return new AirportDTO(airport);
}).toList());
}
}
package com.hcordova.flightagencyapi.airport.domain.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "airports")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Airport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 60)
private String name;
@Column(nullable = false, length = 60)
private String location;
@Column(nullable = false, length = 3)
private String code;
}
package com.hcordova.flightagencyapi.airport.domain.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.airport.domain.models.Airport;
@Repository
public interface AirportRepository extends JpaRepository<Airport, Long>{
}
package com.hcordova.flightagencyapi.airport.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.airport.domain.models.Airport;
public interface AirportService {
List<Airport> getAll();
}
package com.hcordova.flightagencyapi.airport.dto;
import com.hcordova.flightagencyapi.airport.domain.models.Airport;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AirportDTO {
private Long id;
private String name;
private String location;
private String code;
public AirportDTO(Airport airport) {
this.id = airport.getId();
this.name = airport.getName();
this.location = airport.getLocation();
this.code = airport.getCode();
}
}
package com.hcordova.flightagencyapi.airport.services;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.airport.domain.models.Airport;
import com.hcordova.flightagencyapi.airport.domain.repositories.AirportRepository;
import com.hcordova.flightagencyapi.airport.domain.services.AirportService;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class AirportServiceImpl implements AirportService {
private final AirportRepository airportRepository;
@Override
public List<Airport> getAll() {
return airportRepository.findAll();
}
}
package com.hcordova.flightagencyapi.passenger.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.passenger.domain.services.PassengerService;
import com.hcordova.flightagencyapi.passenger.dto.PassengerByDTO;
import com.hcordova.flightagencyapi.passenger.dto.PassengerEditDTO;
import com.hcordova.flightagencyapi.passenger.dto.PassengerTableDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/passengers")
@RequiredArgsConstructor
public class PassengerController {
private final PassengerService passengerService;
@GetMapping
public ResponseEntity<List<PassengerTableDTO>> getAll() {
return ResponseEntity.ok(passengerService.getAll().stream().map(passenger -> {
return new PassengerTableDTO(passenger.getId(), passenger.getUser().getName(), passenger.getUser().getLastname(),
passenger.getCountry(), passenger.getCity());
}).toList());
}
@GetMapping("{id}")
public ResponseEntity<PassengerByDTO> getById(@PathVariable() Long id) {
return ResponseEntity.ok(new PassengerByDTO(passengerService.getById(id)));
}
@PutMapping("{id}")
public ResponseEntity<PassengerByDTO> edit(@RequestBody() PassengerEditDTO passengerEditDTO, @PathVariable() Long id) {
return ResponseEntity.ok(new PassengerByDTO(passengerService.edit(passengerEditDTO, id)));
}
@DeleteMapping("{id}")
public ResponseEntity<PassengerByDTO> delete(@PathVariable() Long id) {
return ResponseEntity.ok(new PassengerByDTO(passengerService.delete(id)));
}
}
package com.hcordova.flightagencyapi.passenger.domain.models;
import java.time.LocalDate;
import com.hcordova.flightagencyapi.shared.domain.models.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "passengers")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Passenger {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 30)
private String country;
@Column(nullable = false, length = 30)
private String city;
@Column(nullable = false, length = 100)
private String address;
@Column(nullable = false, length = 12)
private String phone;
@Column(nullable = false)
@Temporal(TemporalType.DATE)
private LocalDate createdAt;
@Column(nullable = true)
private LocalDate deletedAt;
@OneToOne()
private User user;
}
package com.hcordova.flightagencyapi.passenger.domain.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import com.hcordova.flightagencyapi.passenger.domain.models.Passenger;
public interface PassengerRepository extends JpaRepository<Passenger, Long>{
Optional<Passenger> findByUserId(Long userId);
}
package com.hcordova.flightagencyapi.passenger.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.passenger.domain.models.Passenger;
import com.hcordova.flightagencyapi.passenger.dto.PassengerEditDTO;
public interface PassengerService {
List<Passenger> getAll();
Passenger getById(Long id);
Passenger edit(PassengerEditDTO passenger, Long id);
Passenger delete(Long id);
}
package com.hcordova.flightagencyapi.passenger.dto;
import com.hcordova.flightagencyapi.passenger.domain.models.Passenger;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PassengerByDTO {
private Long id;
private String name;
private String lastname;
private String phone;
private String country;
private String city;
private String address;
private String email;
public PassengerByDTO(Passenger passenger) {
this.id = passenger.getId();
this.name = passenger.getUser().getName();
this.lastname = passenger.getUser().getLastname();
this.phone = passenger.getPhone();
this.country = passenger.getCountry();
this.city = passenger.getCity();
this.address = passenger.getAddress();
this.email = passenger.getUser().getEmail();
}
}
package com.hcordova.flightagencyapi.passenger.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PassengerEditDTO {
private Long id;
private String name;
private String secondName;
private String lastname;
private String phone;
private String country;
private String city;
private String address;
}
package com.hcordova.flightagencyapi.passenger.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class PassengerTableDTO {
private Long id;
private String name;
private String lastname;
private String country;
private String city;
}
package com.hcordova.flightagencyapi.passenger.services;
import java.time.LocalDate;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.passenger.domain.models.Passenger;
import com.hcordova.flightagencyapi.passenger.domain.repositories.PassengerRepository;
import com.hcordova.flightagencyapi.passenger.domain.services.PassengerService;
import com.hcordova.flightagencyapi.passenger.dto.PassengerEditDTO;
import com.hcordova.flightagencyapi.shared.exceptions.NotFoundException;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class PassengerServiceImpl implements PassengerService {
private final PassengerRepository passengerRepository;
@Override
public List<Passenger> getAll() {
return passengerRepository.findAll();
}
@Override
public Passenger getById(Long id) {
return passengerRepository.findById(id)
.orElseThrow(() -> new NotFoundException("Passenger not found"));
}
@Override
public Passenger edit(PassengerEditDTO passenger, Long id) {
Passenger passengerToUpdate = passengerRepository.findById(id).orElse(null);
if (passengerToUpdate == null)
throw new NotFoundException("Passenger not found");
passengerToUpdate.setPhone(passenger.getPhone());
passengerToUpdate.setCountry(passenger.getCountry());
passengerToUpdate.setCity(passenger.getCity());
passengerToUpdate.setAddress(passenger.getAddress());
return passengerRepository.save(passengerToUpdate);
}
@Override
public Passenger delete(Long id) {
Passenger passengerToDelete = getById(id);
passengerToDelete.setDeletedAt(LocalDate.now());
passengerRepository.save(passengerToDelete);
return passengerToDelete;
}
}
package com.hcordova.flightagencyapi.payment.domain.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "payment_status")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PaymentStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 30, unique = true)
private String name;
}
package com.hcordova.flightagencyapi.payment.domain.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.payment.domain.models.PaymentStatus;
@Repository
public interface PaymentStatusRepository extends JpaRepository<PaymentStatus, Long>{
Optional<PaymentStatus> findByName(String name);
}
package com.hcordova.flightagencyapi.payment.domain.services;
import com.hcordova.flightagencyapi.payment.domain.models.PaymentStatus;
public interface PaymentStatusService {
PaymentStatus findByName(String name);
}
package com.hcordova.flightagencyapi.payment.services;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.payment.domain.models.PaymentStatus;
import com.hcordova.flightagencyapi.payment.domain.repositories.PaymentStatusRepository;
import com.hcordova.flightagencyapi.payment.domain.services.PaymentStatusService;
import com.hcordova.flightagencyapi.shared.exceptions.NotFoundException;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class PaymentStatusServiceImpl implements PaymentStatusService {
private final PaymentStatusRepository paymentStatusRepository;
@Override
public PaymentStatus findByName(String name) {
return paymentStatusRepository.findByName(name)
.orElseThrow(() -> new NotFoundException("Payment status not exists!"));
}
}
package com.hcordova.flightagencyapi.reservation.domain.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "reservation_status")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ReservationStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 30, unique = true)
private String name;
}
package com.hcordova.flightagencyapi.reservation.domain.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.reservation.domain.models.ReservationStatus;
@Repository
public interface ReservationStatusRepository extends JpaRepository<ReservationStatus, Long>{
Optional<ReservationStatus> findByName(String name);
}
package com.hcordova.flightagencyapi.reservation.domain.services;
import com.hcordova.flightagencyapi.reservation.domain.models.ReservationStatus;
public interface ReservationStatusService {
ReservationStatus findByName(String name);
}
package com.hcordova.flightagencyapi.reservation.services;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.reservation.domain.models.ReservationStatus;
import com.hcordova.flightagencyapi.reservation.domain.repositories.ReservationStatusRepository;
import com.hcordova.flightagencyapi.reservation.domain.services.ReservationStatusService;
import com.hcordova.flightagencyapi.shared.exceptions.NotFoundException;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class ReservationStatusServiceImpl implements ReservationStatusService {
private final ReservationStatusRepository reservationStatusRepository;
@Override
public ReservationStatus findByName(String name) {
return reservationStatusRepository.findByName(name)
.orElseThrow(() -> new NotFoundException("Reservation status not found"));
}
}
......@@ -13,6 +13,7 @@ import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import com.hcordova.flightagencyapi.shared.domain.services.JwtService;
import com.hcordova.flightagencyapi.shared.domain.services.UserService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
......
package com.hcordova.flightagencyapi.shared.controllers;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -15,6 +15,7 @@ import com.hcordova.flightagencyapi.shared.dto.SignUpResponseDTO;
import lombok.RequiredArgsConstructor;
@CrossOrigin(origins = "*")
@RestController
@RequestMapping("/api/v1/auth")
@RequiredArgsConstructor
......
......@@ -17,7 +17,6 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
......
package com.hcordova.flightagencyapi.shared.services;
import java.time.LocalDate;
import org.springframework.cglib.core.Local;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
......@@ -8,6 +11,10 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.agent.domain.models.Agent;
import com.hcordova.flightagencyapi.agent.domain.repositories.AgentRepository;
import com.hcordova.flightagencyapi.passenger.domain.models.Passenger;
import com.hcordova.flightagencyapi.passenger.domain.repositories.PassengerRepository;
import com.hcordova.flightagencyapi.shared.domain.models.User;
import com.hcordova.flightagencyapi.shared.domain.repositories.RoleRepository;
import com.hcordova.flightagencyapi.shared.domain.repositories.UserRepository;
......@@ -17,15 +24,21 @@ import com.hcordova.flightagencyapi.shared.dto.SignInRequestDTO;
import com.hcordova.flightagencyapi.shared.dto.SignInResponseDTO;
import com.hcordova.flightagencyapi.shared.dto.SignUpRequestDTO;
import com.hcordova.flightagencyapi.shared.dto.SignUpResponseDTO;
import com.hcordova.flightagencyapi.shared.exceptions.NotFoundException;
import com.hcordova.flightagencyapi.supervisor.domain.models.Supervisor;
import com.hcordova.flightagencyapi.supervisor.domain.repositories.SupervisorRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
@RequiredArgsConstructor
public class AuthenticationServiceImpl implements AuthenticationService {
private final UserRepository userRepository;
private final PassengerRepository passengerRepository;
private final AgentRepository agentRepository;
private final SupervisorRepository supervisorRepository;
private final RoleRepository roleRepository;
private final JwtService jService;
private final AuthenticationManager authenticationManager;
......@@ -39,25 +52,37 @@ public class AuthenticationServiceImpl implements AuthenticationService {
.orElseThrow(() -> new UsernameNotFoundException("Invalid email or password"));
var jwt = jService.generateToken(user);
var response = new SignInResponseDTO(user.getId(), user.getName(), user.getLastname(), user.getEmail(), user.getRole().getName(), jwt);
var id = getIdByRoleAndUserId(user.getRole().getName(), user.getId());
var response = new SignInResponseDTO(id, user.getName(), user.getLastname(), user.getEmail(), user.getRole().getName(), jwt);
return ResponseEntity.status(HttpStatus.OK).body(response);
}
private Long getIdByRoleAndUserId(String role, Long id) {
switch(role.toLowerCase()) {
case "passenger":
return passengerRepository.findByUserId(id).get().getId();
case "agent":
return agentRepository.findByUserId(id).get().getId();
case "supervisor":
return supervisorRepository.findByUserId(id).get().getId();
}
return 0L;
}
@Override
@Transactional
public ResponseEntity<SignUpResponseDTO> signUp(SignUpRequestDTO requestDTO) {
var userFound = userRepository.findByEmail(requestDTO.getEmail());
if (userFound.isPresent()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
if (userFound.isPresent())
throw new IllegalArgumentException("Email already exists!");
var role = roleRepository.findByName(requestDTO.getRole());
var role = roleRepository.findByName(requestDTO.getRole().toLowerCase());
if (role.isEmpty()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
if (role.isEmpty())
throw new NotFoundException("Role not found!");
var user = new User(
requestDTO.getName(),
......@@ -67,22 +92,56 @@ public class AuthenticationServiceImpl implements AuthenticationService {
role.get());
var userCreated = userRepository.save(user);
Long userId = 0L;
switch(userCreated.getRole().getName().toLowerCase()) {
case "passenger":
Passenger passenger = passengerRepository.save(buildPassenger(requestDTO, userCreated));
userId = passenger.getId();
break;
case "agent":
Agent agent = agentRepository.save(buildAgent(requestDTO, userCreated));
userId = agent.getId();
break;
case "supervisor":
Supervisor supervisor = supervisorRepository.save(buildSupervisor(requestDTO, userCreated));
userId = supervisor.getId();
break;
}
var response = new SignUpResponseDTO(userCreated.getId(), userCreated.getName(), userCreated.getLastname(), userCreated.getEmail(), userCreated.getRole().getName());
var response = new SignUpResponseDTO(userId, userCreated.getName(), userCreated.getLastname(), userCreated.getEmail(), userCreated.getRole().getName());
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
// private boolean registerPassenger(String secondName, String country, String city, String phone, String address) {
// }
// private boolean registerAgent(String details) {
// }
private Passenger buildPassenger(SignUpRequestDTO requestDTO, User userCreated) {
return new Passenger(
0L,
requestDTO.getCountry(),
requestDTO.getCity(),
requestDTO.getAddress(),
requestDTO.getPhone(),
LocalDate.now(),
null,
userCreated);
}
// private boolean registerSupervisor(String details) {
private Agent buildAgent(SignUpRequestDTO requestDTO, User userCreated) {
return new Agent(
0L,
requestDTO.getDetails(),
userCreated,
LocalDate.now(),
null);
}
// }
private Supervisor buildSupervisor(SignUpRequestDTO requestDTO, User userCreated) {
return new Supervisor(
0L,
requestDTO.getDetails(),
LocalDate.now(),
null,
userCreated);
}
}
......@@ -49,7 +49,7 @@ public class JwtServiceImpl implements JwtService {
private String generateToken(Map<String, Object> extraClaims, UserDetails userDetails) {
return Jwts.builder().setClaims(extraClaims).setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 24))
.setExpiration(new Date(System.currentTimeMillis() + 86400000))
.signWith(getSigningKey(), SignatureAlgorithm.HS256).compact();
}
......
package com.hcordova.flightagencyapi.supervisor.controllers;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hcordova.flightagencyapi.supervisor.domain.services.SupervisorService;
import com.hcordova.flightagencyapi.supervisor.dto.SupervisorDTO;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/supervisors")
@RequiredArgsConstructor
public class SupervisorController {
private final SupervisorService supervisorService;
@GetMapping
public ResponseEntity<List<SupervisorDTO>> getAll() {
List<SupervisorDTO> supervisors = supervisorService.getAll().stream().map(supervisor -> {
return new SupervisorDTO(supervisor);
}).toList();
return ResponseEntity.ok(supervisors);
}
}
package com.hcordova.flightagencyapi.supervisor.domain.models;
import java.time.LocalDate;
import com.hcordova.flightagencyapi.shared.domain.models.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "supervisors")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Supervisor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String details;
@Column(nullable = false)
@Temporal(TemporalType.DATE)
private LocalDate createdAt;
@Column(nullable = true)
@Temporal(TemporalType.DATE)
private LocalDate deletedAt;
@OneToOne()
User user;
}
package com.hcordova.flightagencyapi.supervisor.domain.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hcordova.flightagencyapi.supervisor.domain.models.Supervisor;
@Repository
public interface SupervisorRepository extends JpaRepository<Supervisor, Long>{
Optional<Supervisor> findByUserId(Long userId);
}
package com.hcordova.flightagencyapi.supervisor.domain.services;
import java.util.List;
import com.hcordova.flightagencyapi.supervisor.domain.models.Supervisor;
public interface SupervisorService {
List<Supervisor> getAll();
}
package com.hcordova.flightagencyapi.supervisor.dto;
import com.hcordova.flightagencyapi.supervisor.domain.models.Supervisor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class SupervisorDTO {
private Long id;
private String name;
private String lastname;
private String email;
private String details;
public SupervisorDTO(Supervisor supervisor) {
this.id = supervisor.getUser().getId();
this.name = supervisor.getUser().getName();
this.lastname = supervisor.getUser().getLastname();
this.email = supervisor.getUser().getEmail();
this.details = supervisor.getDetails();
}
}
package com.hcordova.flightagencyapi.supervisor.services;
import java.util.List;
import org.springframework.stereotype.Service;
import com.hcordova.flightagencyapi.supervisor.domain.models.Supervisor;
import com.hcordova.flightagencyapi.supervisor.domain.repositories.SupervisorRepository;
import com.hcordova.flightagencyapi.supervisor.domain.services.SupervisorService;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class SupervisorServiceImpl implements SupervisorService {
private final SupervisorRepository supervisorRepository;
@Override
public List<Supervisor> getAll() {
return supervisorRepository.findAll();
}
}
-- INSERT INTO roles (name) VALUES ('supervisor'), ('agent'), ('passenger');
-- INSERT INTO airports (name, location, code)
-- VALUES
-- ('Jorge Chavez International Airport', 'Lima, Peru', 'LIM'),
-- ('John F. Kennedy International Airport', 'New York, USA', 'JFK'),
-- ('Heathrow Airport', 'London, UK', 'LHR'),
-- ('Charles de Gaulle Airport', 'Paris, France', 'CDG'),
-- ('Los Angeles International Airport', 'Los Angeles, USA', 'LAX'),
-- ('Sydney Kingsford Smith Airport', 'Sydney, Australia', 'SYD'),
-- ('Dubai International Airport', 'Dubai, UAE', 'DXB'),
-- ('Beijing Capital International Airport', 'Beijing, China', 'PEK'),
-- ('Benito Juarez International Airport', 'Mexico City, Mexico', 'MEX'),
-- ('Frankfurt Airport', 'Frankfurt, Germany', 'FRA'),
-- ('Toronto Pearson International Airport', 'Toronto, Canada', 'YYZ'),
-- ('Incheon International Airport', 'Seoul, South Korea', 'ICN'),
-- ('Sao Paulo-Guarulhos International Airport', 'Sao Paulo, Brazil', 'GRU'),
-- ('Barcelona-El Prat Airport', 'Barcelona, Spain', 'BCN'),
-- ('Cairo International Airport', 'Cairo, Egypt', 'CAI');
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment