From 0d70737fbc7a590243c2875a6429aec7d478ab6c Mon Sep 17 00:00:00 2001 From: ken1000minus7 Date: Mon, 11 Sep 2023 22:55:45 +0530 Subject: [PATCH] End event endpoint completed --- .../backend/controllers/EventsController.java | 8 ++ .../com/pecacm/backend/entities/Event.java | 29 ++++--- .../pecacm/backend/entities/Organiser.java | 29 ------- .../pecacm/backend/entities/Transaction.java | 12 ++- .../java/com/pecacm/backend/enums/Branch.java | 10 +++ .../com/pecacm/backend/enums/EventRole.java | 7 ++ .../pecacm/backend/model/EndEventDetails.java | 38 +++++++++ .../repository/TransactionRepository.java | 9 +++ .../backend/repository/UserRepository.java | 4 + .../pecacm/backend/services/EventService.java | 81 +++++++++++++++++-- 10 files changed, 179 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/com/pecacm/backend/entities/Organiser.java create mode 100644 src/main/java/com/pecacm/backend/enums/Branch.java create mode 100644 src/main/java/com/pecacm/backend/enums/EventRole.java create mode 100644 src/main/java/com/pecacm/backend/model/EndEventDetails.java create mode 100644 src/main/java/com/pecacm/backend/repository/TransactionRepository.java diff --git a/src/main/java/com/pecacm/backend/controllers/EventsController.java b/src/main/java/com/pecacm/backend/controllers/EventsController.java index 3b2f19c..522dc4a 100644 --- a/src/main/java/com/pecacm/backend/controllers/EventsController.java +++ b/src/main/java/com/pecacm/backend/controllers/EventsController.java @@ -2,6 +2,7 @@ import com.pecacm.backend.constants.Constants; import com.pecacm.backend.entities.Event; +import com.pecacm.backend.model.EndEventDetails; import com.pecacm.backend.services.EventService; import jakarta.annotation.Nullable; import org.springframework.beans.factory.annotation.Autowired; @@ -76,4 +77,11 @@ public ResponseEntity deleteEvent(@PathVariable Integer eventId) { eventService.deleteEvent(eventId); return ResponseEntity.status(HttpStatus.OK).build(); } + + @PostMapping("/{eventId}/end") + @PreAuthorize(Constants.HAS_ROLE_CORE_AND_ABOVE) + public ResponseEntity endEvent(@PathVariable Integer eventId, @RequestBody EndEventDetails endEventDetails) { + eventService.endEvent(eventId, endEventDetails); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/pecacm/backend/entities/Event.java b/src/main/java/com/pecacm/backend/entities/Event.java index a8edf29..4cc3a65 100644 --- a/src/main/java/com/pecacm/backend/entities/Event.java +++ b/src/main/java/com/pecacm/backend/entities/Event.java @@ -1,9 +1,10 @@ package com.pecacm.backend.entities; +import com.pecacm.backend.enums.Branch; import jakarta.persistence.*; import lombok.*; -import java.sql.Timestamp; +import java.time.LocalDateTime; @Entity @Getter @@ -19,21 +20,27 @@ public class Event { @Column(name = "id", unique = true, nullable = false) private Integer id; - @Column(name = "name", nullable = false) - private String name; + @Column(name = "title", nullable = false) + private String title; - @Column(name = "branch") - private String branch; + @Enumerated(EnumType.STRING) + private Branch branch; - @Column(name = "date") - private Timestamp date; + @Column(name = "start_date") + private LocalDateTime startDate; - @Column(name="detail", nullable = false) - private String detail; + @Column(name = "end_date") + private LocalDateTime endDate; + + @Column(name="description", nullable = false) + private String description; @Column(name = "attendance_sheet") private String attendance; - @Column(name = "event_status", nullable = false) - private String eventStatus; + @Column(name = "venue") + private String venue; + + @Column(name = "ended") + private boolean ended = false; } diff --git a/src/main/java/com/pecacm/backend/entities/Organiser.java b/src/main/java/com/pecacm/backend/entities/Organiser.java deleted file mode 100644 index 3ce4e14..0000000 --- a/src/main/java/com/pecacm/backend/entities/Organiser.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pecacm.backend.entities; - -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "organisers", schema = "public") -@Builder -public class Organiser { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", unique = true, nullable = false) - private Integer id; - - @ManyToOne - @JoinColumn(name = "user_id") - private User user; - - @ManyToOne - @JoinColumn(name = "event_id") - private Event event; - - @Column(name = "work_done") - private String work; -} diff --git a/src/main/java/com/pecacm/backend/entities/Transaction.java b/src/main/java/com/pecacm/backend/entities/Transaction.java index ce67673..f5cb3be 100644 --- a/src/main/java/com/pecacm/backend/entities/Transaction.java +++ b/src/main/java/com/pecacm/backend/entities/Transaction.java @@ -1,14 +1,17 @@ package com.pecacm.backend.entities; +import com.pecacm.backend.enums.EventRole; import jakarta.persistence.*; import lombok.*; +import java.time.LocalDateTime; + @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor -@Table(name="events", schema = "public") +@Table(name="transactions", schema = "public") @Builder public class Transaction { @Id @@ -24,8 +27,11 @@ public class Transaction { @JoinColumn(name = "event_id") private Event event; - @Column(name = "role") - private String role; + @Enumerated(EnumType.STRING) + private EventRole role = EventRole.PARTICIPANT; + + @Column(name = "date") + private LocalDateTime date; @Column(name = "xp_awarded") private Integer xp; diff --git a/src/main/java/com/pecacm/backend/enums/Branch.java b/src/main/java/com/pecacm/backend/enums/Branch.java new file mode 100644 index 0000000..75f686f --- /dev/null +++ b/src/main/java/com/pecacm/backend/enums/Branch.java @@ -0,0 +1,10 @@ +package com.pecacm.backend.enums; + +public enum Branch { + DEVELOPMENT, + AI, + CP, + CYBER, + SOCIALS, + WIT +} diff --git a/src/main/java/com/pecacm/backend/enums/EventRole.java b/src/main/java/com/pecacm/backend/enums/EventRole.java new file mode 100644 index 0000000..5b65f00 --- /dev/null +++ b/src/main/java/com/pecacm/backend/enums/EventRole.java @@ -0,0 +1,7 @@ +package com.pecacm.backend.enums; + +public enum EventRole { + ORGANIZER, + PUBLICITY, + PARTICIPANT +} diff --git a/src/main/java/com/pecacm/backend/model/EndEventDetails.java b/src/main/java/com/pecacm/backend/model/EndEventDetails.java new file mode 100644 index 0000000..b22d361 --- /dev/null +++ b/src/main/java/com/pecacm/backend/model/EndEventDetails.java @@ -0,0 +1,38 @@ +package com.pecacm.backend.model; + +import com.pecacm.backend.enums.EventRole; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class EndEventDetails { + private List contributors = new ArrayList<>(); + private List publicity = new ArrayList<>(); + // Can take gsheet link instead and call gsheet api + private List participants = new ArrayList<>(); + private Integer contributorXp = 5; + private Integer publicityXp = 2; + private Integer participantXp = 1; + + public Integer getXp(EventRole role) { + switch (role) { + case ORGANIZER -> { + return contributorXp; + } + case PUBLICITY -> { + return publicityXp; + } + default -> { + return participantXp; + } + } + } +} diff --git a/src/main/java/com/pecacm/backend/repository/TransactionRepository.java b/src/main/java/com/pecacm/backend/repository/TransactionRepository.java new file mode 100644 index 0000000..337d7a1 --- /dev/null +++ b/src/main/java/com/pecacm/backend/repository/TransactionRepository.java @@ -0,0 +1,9 @@ +package com.pecacm.backend.repository; + +import com.pecacm.backend.entities.Transaction; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TransactionRepository extends JpaRepository { +} diff --git a/src/main/java/com/pecacm/backend/repository/UserRepository.java b/src/main/java/com/pecacm/backend/repository/UserRepository.java index d6e20ea..bbe5abd 100644 --- a/src/main/java/com/pecacm/backend/repository/UserRepository.java +++ b/src/main/java/com/pecacm/backend/repository/UserRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; import java.util.Optional; @@ -16,6 +17,9 @@ public interface UserRepository extends JpaRepository { Optional findByEmail(String email); + @Query("SELECT u FROM User u WHERE u.email in :emails") + List findAllByEmail(Collection emails); + @Query("SELECT u.designation FROM User u " + "WHERE u.email = :email") Optional findRoleByEmail(String email); diff --git a/src/main/java/com/pecacm/backend/services/EventService.java b/src/main/java/com/pecacm/backend/services/EventService.java index 6c30175..807fbd2 100644 --- a/src/main/java/com/pecacm/backend/services/EventService.java +++ b/src/main/java/com/pecacm/backend/services/EventService.java @@ -2,19 +2,23 @@ import com.pecacm.backend.constants.ErrorConstants; import com.pecacm.backend.entities.Event; +import com.pecacm.backend.entities.Transaction; import com.pecacm.backend.entities.User; +import com.pecacm.backend.enums.EventRole; import com.pecacm.backend.exception.AcmException; +import com.pecacm.backend.model.EndEventDetails; import com.pecacm.backend.repository.AttendanceRepository; import com.pecacm.backend.repository.EventRepository; +import com.pecacm.backend.repository.TransactionRepository; import com.pecacm.backend.repository.UserRepository; +import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.Pair; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.time.LocalDateTime; +import java.util.*; @Service public class EventService { @@ -22,12 +26,14 @@ public class EventService { private final EventRepository eventRepository; private final AttendanceRepository attendanceRepository; private final UserRepository userRepository; + private final TransactionRepository transactionRepository; @Autowired - public EventService(EventRepository eventRepository, AttendanceRepository attendanceRepository, UserRepository userRepository) { + public EventService(EventRepository eventRepository, AttendanceRepository attendanceRepository, UserRepository userRepository, TransactionRepository transactionRepository) { this.eventRepository = eventRepository; this.attendanceRepository = attendanceRepository; this.userRepository = userRepository; + this.transactionRepository = transactionRepository; } // TODO : change all GET events to pageable repositories @@ -92,4 +98,69 @@ public void deleteEvent(Integer eventId) { throw new AcmException("Event cannot be deleted, eventId=" + eventId, HttpStatus.BAD_REQUEST); } } + + @Transactional + public void endEvent(Integer eventId, EndEventDetails endEventDetails) { + + Event event = eventRepository.findById(eventId).orElseThrow(() -> + new AcmException("Event not found", HttpStatus.NOT_FOUND) + ); + + if(event.isEnded()) { + throw new AcmException("Event has already ended", HttpStatus.BAD_REQUEST); + } + + Map userMap = new HashMap<>(); + Set emails = new HashSet<>(); + + emails.addAll(endEventDetails.getContributors()); + emails.addAll(endEventDetails.getPublicity()); + emails.addAll(endEventDetails.getParticipants()); + + List users = userRepository.findAllByEmail(emails); + users.forEach(user -> { + userMap.put(user.getEmail(), user); + }); + + List> eventUsers = new ArrayList<>(); + + endEventDetails.getContributors().forEach(email -> { + Optional.ofNullable(userMap.get(email)).ifPresent(user -> { + eventUsers.add(Pair.of(user, EventRole.ORGANIZER)); + }); + }); + endEventDetails.getPublicity().forEach(email -> { + Optional.ofNullable(userMap.get(email)).ifPresent(user -> { + eventUsers.add(Pair.of(user, EventRole.PUBLICITY)); + }); + }); + endEventDetails.getParticipants().forEach(email -> { + Optional.ofNullable(userMap.get(email)).ifPresent(user -> { + eventUsers.add(Pair.of(user, EventRole.PARTICIPANT)); + }); + }); + + List transactions = eventUsers.stream().map((userEventRolePair) -> { + User user = userEventRolePair.getFirst(); + EventRole eventRole = userEventRolePair.getSecond(); + Integer xp = endEventDetails.getXp(eventRole); + + user.setXp(user.getXp() + xp); + + return Transaction.builder() + .event(event) + .xp(xp) + .user(user) + .role(eventRole) + .date(LocalDateTime.now()) + .build(); + }).toList(); + + transactionRepository.saveAll(transactions); + userRepository.saveAll(users); + + event.setEnded(true); + eventRepository.save(event); + + } }