Skip to content

Commit

Permalink
Merge pull request #41 from PEC-CSS/ken
Browse files Browse the repository at this point in the history
End event endpoint completed
  • Loading branch information
harshjohar authored Sep 11, 2023
2 parents 1ed5197 + 0d70737 commit 2810cf2
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -76,4 +77,11 @@ public ResponseEntity<Void> 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<Void> endEvent(@PathVariable Integer eventId, @RequestBody EndEventDetails endEventDetails) {
eventService.endEvent(eventId, endEventDetails);
return ResponseEntity.ok().build();
}
}
29 changes: 18 additions & 11 deletions src/main/java/com/pecacm/backend/entities/Event.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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;
}
29 changes: 0 additions & 29 deletions src/main/java/com/pecacm/backend/entities/Organiser.java

This file was deleted.

12 changes: 9 additions & 3 deletions src/main/java/com/pecacm/backend/entities/Transaction.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/pecacm/backend/enums/Branch.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.pecacm.backend.enums;

public enum Branch {
DEVELOPMENT,
AI,
CP,
CYBER,
SOCIALS,
WIT
}
7 changes: 7 additions & 0 deletions src/main/java/com/pecacm/backend/enums/EventRole.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.pecacm.backend.enums;

public enum EventRole {
ORGANIZER,
PUBLICITY,
PARTICIPANT
}
38 changes: 38 additions & 0 deletions src/main/java/com/pecacm/backend/model/EndEventDetails.java
Original file line number Diff line number Diff line change
@@ -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<String> contributors = new ArrayList<>();
private List<String> publicity = new ArrayList<>();
// Can take gsheet link instead and call gsheet api
private List<String> 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;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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<Transaction, Integer> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -16,6 +17,9 @@ public interface UserRepository extends JpaRepository<User, Integer> {

Optional<User> findByEmail(String email);

@Query("SELECT u FROM User u WHERE u.email in :emails")
List<User> findAllByEmail(Collection<String> emails);

@Query("SELECT u.designation FROM User u " +
"WHERE u.email = :email")
Optional<Role> findRoleByEmail(String email);
Expand Down
81 changes: 76 additions & 5 deletions src/main/java/com/pecacm/backend/services/EventService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,38 @@

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 {

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
Expand Down Expand Up @@ -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<String, User> userMap = new HashMap<>();
Set<String> emails = new HashSet<>();

emails.addAll(endEventDetails.getContributors());
emails.addAll(endEventDetails.getPublicity());
emails.addAll(endEventDetails.getParticipants());

List<User> users = userRepository.findAllByEmail(emails);
users.forEach(user -> {
userMap.put(user.getEmail(), user);
});

List<Pair<User, EventRole>> 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<Transaction> 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);

}
}

0 comments on commit 2810cf2

Please sign in to comment.