Skip to content

Commit

Permalink
Merge pull request #69 from PEC-CSS/feat-support-apis
Browse files Browse the repository at this point in the history
Admin Support User and Event API
  • Loading branch information
harshjohar authored Oct 15, 2023
2 parents fd6dc4e + 4c70d01 commit 7456691
Show file tree
Hide file tree
Showing 8 changed files with 209 additions and 4 deletions.
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,63 @@
package com.pecacm.backend.controllers;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.pecacm.backend.constants.Constants;
import com.pecacm.backend.entities.Event;
import com.pecacm.backend.exception.AcmException;
import com.pecacm.backend.response.EventUserDetails;
import com.pecacm.backend.response.SupportEventResponse;
import com.pecacm.backend.response.SupportUserResponse;
import com.pecacm.backend.services.EventService;
import com.pecacm.backend.services.SupportService;
import jakarta.annotation.Nullable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.util.Pair;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/v1/support")
public class SupportController {
// Common class for starting multiple issues

private final SupportService supportService;
private final EventService eventService;

public SupportController(SupportService supportService, EventService eventService) {
this.supportService = supportService;
this.eventService = eventService;
}

@GetMapping("/user/{email}")
@PreAuthorize(Constants.HAS_ROLE_ADMIN)
public ResponseEntity<SupportUserResponse> getUserDetails(@PathVariable String email, @RequestParam @Nullable Integer offset, @RequestParam @Nullable Integer pageSize) {

if (offset == null) offset = 0;
if (pageSize == null) pageSize = 20;

if (offset < 0) throw new AcmException("offset cannot be < 0", HttpStatus.BAD_REQUEST);
if (pageSize <= 0) throw new AcmException("pageSize must be >= 0", HttpStatus.BAD_REQUEST);

return ResponseEntity.ok(supportService.getSupportUserDetails(email, PageRequest.of(offset, pageSize)));
}

@GetMapping("/events/{eventId}")
@PreAuthorize(Constants.HAS_ROLE_ADMIN)
public ResponseEntity<SupportEventResponse> getEventDetails(@PathVariable Integer eventId, @RequestParam @Nullable Integer offset, @RequestParam @Nullable Integer pageSize) {

if (offset == null) offset = 0;
if (pageSize == null) pageSize = 10;

if (offset < 0) throw new AcmException("offset cannot be < 0", HttpStatus.BAD_REQUEST);
if (pageSize <= 0) throw new AcmException("pageSize must be >= 0", HttpStatus.BAD_REQUEST);

Event event = eventService.getSingleEvent(eventId);
Pair<List<EventUserDetails>, List<EventUserDetails>> nonParticipants = supportService.getNonParticipants(eventId);
Page<EventUserDetails> participants = supportService.getEventParticipants(event, PageRequest.of(offset, pageSize));

return ResponseEntity.ok(new SupportEventResponse(event, participants, nonParticipants.getFirst(), nonParticipants.getSecond()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,18 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface TransactionRepository extends JpaRepository<Transaction, Integer> {
Page<Transaction> findByUserId(Integer userId, PageRequest pageRequest);
Page<Transaction> findByUserIdAndRole(Integer userId, EventRole role, PageRequest pageRequest);
}
@Query("SELECT t from Transaction t WHERE t.event.id = :eventId AND t.role IN :roles")
List<Transaction> findListByEventIdAndRoles(Integer eventId, List<EventRole> roles);

Page<Transaction> findByEventIdAndRole(Integer eventId, EventRole eventRole, PageRequest pageRequest);

}
15 changes: 15 additions & 0 deletions src/main/java/com/pecacm/backend/response/EventUserDetails.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.pecacm.backend.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
public class EventUserDetails {
private Integer id;
private String email;
private String name;
private String dp;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.pecacm.backend.response;

import com.pecacm.backend.entities.Event;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.domain.Page;

import java.util.List;

@Getter
@Setter
@AllArgsConstructor
public class SupportEventResponse {
private Event event;
private Page<EventUserDetails> participants;
private List<EventUserDetails> contributors;
private List<EventUserDetails> publicity;
}
16 changes: 16 additions & 0 deletions src/main/java/com/pecacm/backend/response/SupportUserResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.pecacm.backend.response;

import com.pecacm.backend.entities.User;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.domain.Page;


@Getter
@Setter
@AllArgsConstructor
public class SupportUserResponse {
private User user;
private Page<UserEventDetails> events;
}
19 changes: 19 additions & 0 deletions src/main/java/com/pecacm/backend/response/UserEventDetails.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.pecacm.backend.response;

import com.pecacm.backend.enums.EventRole;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@AllArgsConstructor
public class UserEventDetails {
private Integer id;
private String name;
private EventRole role;
private Integer xp_gained;
private LocalDateTime timestamp;
}
71 changes: 71 additions & 0 deletions src/main/java/com/pecacm/backend/services/SupportService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.pecacm.backend.services;

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.repository.TransactionRepository;
import com.pecacm.backend.response.EventUserDetails;
import com.pecacm.backend.response.UserEventDetails;
import com.pecacm.backend.response.SupportUserResponse;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;

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

@Service
public class SupportService {
private final TransactionRepository transactionRepository;
private final UserService userService;

public SupportService(TransactionRepository transactionRepository, UserService userService) {
this.transactionRepository = transactionRepository;
this.userService = userService;
}

public SupportUserResponse getSupportUserDetails(String email, PageRequest pageRequest) {
User user = userService.getUserByEmail(email);
Page<Transaction> transactions = transactionRepository.findByUserId(user.getId(), pageRequest);
List<UserEventDetails> events = transactions.stream()
.map(transaction -> {
Event event = transaction.getEvent();
return new UserEventDetails(event.getId(), event.getTitle(), transaction.getRole(), transaction.getXp(), event.getEndDate());
}).collect(Collectors.toList());
Page<UserEventDetails> eventsPage = new PageImpl<>(events, pageRequest, events.size());
return new SupportUserResponse(user, eventsPage);
}

@Cacheable("getNonParticipants")
public Pair<List<EventUserDetails>, List<EventUserDetails>> getNonParticipants(Integer eventId) {
List<EventUserDetails> contributors = new ArrayList<>();
List<EventUserDetails> publicity = new ArrayList<>();

transactionRepository.findListByEventIdAndRoles(eventId, List.of(EventRole.ORGANIZER, EventRole.PUBLICITY)).forEach(transaction -> {
User user = transaction.getUser();
EventUserDetails eventUserDetails = new EventUserDetails(user.getId(), user.getEmail(), user.getName(), user.getDp());
if (transaction.getRole() == EventRole.ORGANIZER) {
contributors.add(eventUserDetails);
} else if (transaction.getRole() == EventRole.PUBLICITY) {
publicity.add(eventUserDetails);
}
});

return Pair.of(contributors, publicity);
}

public Page<EventUserDetails> getEventParticipants(Event event, PageRequest pageRequest) {
List<EventUserDetails> participants = transactionRepository.findByEventIdAndRole(event.getId(), EventRole.PARTICIPANT, pageRequest)
.stream().map(transaction -> {
User user = transaction.getUser();
return new EventUserDetails(user.getId(), user.getEmail(), user.getName(), user.getDp());
}).collect(Collectors.toList());

return new PageImpl<>(participants, pageRequest, participants.size());
}
}

0 comments on commit 7456691

Please sign in to comment.