2021-01-06 13:40:04 +01:00
package com.plannaplan.controllers ;
2021-01-07 16:51:35 +01:00
import java.util.List ;
2021-01-06 13:40:04 +01:00
import java.util.Map ;
2021-01-06 14:34:25 +01:00
import java.util.Optional ;
2021-01-10 10:57:33 +01:00
import java.util.stream.Collectors ;
2021-01-06 13:40:04 +01:00
import com.plannaplan.App ;
2021-01-06 14:34:25 +01:00
import com.plannaplan.entities.Assignment ;
2021-01-06 14:50:34 +01:00
import com.plannaplan.entities.Exchange ;
2021-01-06 14:34:25 +01:00
import com.plannaplan.entities.Groups ;
import com.plannaplan.entities.User ;
2021-01-06 16:23:18 +01:00
import com.plannaplan.exceptions.UserNotFoundException ;
2021-01-07 16:51:35 +01:00
import com.plannaplan.responses.mappers.ExchangeResponseMappers ;
import com.plannaplan.responses.models.ExchangeResponse ;
2021-01-06 14:50:34 +01:00
import com.plannaplan.services.AssignmentService ;
import com.plannaplan.services.ExchangeService ;
import com.plannaplan.services.GroupService ;
2021-01-06 14:34:25 +01:00
2021-01-06 14:50:34 +01:00
import org.springframework.beans.factory.annotation.Autowired ;
2021-01-06 14:34:25 +01:00
import org.springframework.http.HttpStatus ;
2021-01-06 13:40:04 +01:00
import org.springframework.http.ResponseEntity ;
import org.springframework.web.bind.annotation.CrossOrigin ;
import org.springframework.web.bind.annotation.PostMapping ;
2021-01-07 16:01:25 +01:00
import org.springframework.web.bind.annotation.DeleteMapping ;
2021-01-07 16:51:35 +01:00
import org.springframework.web.bind.annotation.GetMapping ;
2021-01-07 16:01:25 +01:00
import org.springframework.web.bind.annotation.PathVariable ;
2021-01-06 13:40:04 +01:00
import org.springframework.web.bind.annotation.RequestBody ;
import org.springframework.web.bind.annotation.RequestMapping ;
import org.springframework.web.bind.annotation.RestController ;
import io.swagger.annotations.Api ;
import io.swagger.annotations.ApiOperation ;
@RestController
@CrossOrigin
@RequestMapping ( " /api/ " + App . API_VERSION + " /exchanges " )
@Api ( tags = { " Exchange " } , value = " Exchange " , description = " Endpoint to exchange with accepted assignments. " )
2021-01-06 16:23:18 +01:00
public class ExchangeController extends TokenBasedController {
2021-01-06 14:50:34 +01:00
@Autowired
private GroupService groupService ;
@Autowired
private AssignmentService assignmentService ;
2021-01-06 14:34:25 +01:00
2021-01-06 14:50:34 +01:00
@Autowired
private ExchangeService exchangeService ;
2021-01-06 13:40:04 +01:00
@PostMapping ( " /exchange " )
@ApiOperation ( value = " Return all courses " )
2021-01-06 16:23:18 +01:00
public ResponseEntity < String > createExchange ( @RequestBody Map < String , Long > exchangeRequest )
throws UserNotFoundException {
2021-01-06 14:34:25 +01:00
2021-01-06 16:23:18 +01:00
final User asker = this . getCurrentUser ( )
. orElseThrow ( ( ) - > new UserNotFoundException ( " Invalid token " ) ) ;
2021-01-06 14:50:34 +01:00
final Long assignmentId = exchangeRequest . get ( " assignment " ) ;
final Long groupId = exchangeRequest . get ( " group " ) ;
2021-01-10 10:57:33 +01:00
final List < Long > ownedGroups = asker . getStudentRegisteredGrups ( ) . stream ( ) . map ( Groups : : getId ) . collect ( Collectors . toList ( ) ) ;
if ( ownedGroups . contains ( groupId ) ) {
return new ResponseEntity < > ( " User has already got this group. " , HttpStatus . BAD_REQUEST ) ;
}
2021-01-06 14:50:34 +01:00
2021-01-06 16:23:18 +01:00
if ( assignmentId = = null | | groupId = = null ) {
2021-01-06 14:50:34 +01:00
return new ResponseEntity < > ( " Some of values are missing " , HttpStatus . BAD_REQUEST ) ;
2021-01-06 14:34:25 +01:00
}
2021-01-06 14:50:34 +01:00
final Optional < Assignment > assignment = this . assignmentService . getById ( assignmentId ) ;
final Optional < Groups > group = this . groupService . getGroupById ( groupId ) ;
2021-01-06 16:23:18 +01:00
if ( assignment . isEmpty ( ) | | group . isEmpty ( ) ) {
2021-01-06 14:50:34 +01:00
return new ResponseEntity < > ( " Some of provided value does not exist. " , HttpStatus . BAD_REQUEST ) ;
}
2021-01-06 16:23:18 +01:00
final Assignment assignmentInstance = assignment . get ( ) ;
2021-01-06 16:50:08 +01:00
final Groups groupInstance = group . get ( ) ;
2021-01-06 16:23:18 +01:00
2021-01-06 17:12:20 +01:00
if ( ! ( assignmentInstance . getCommision ( ) . getCommisionOwner ( ) . getId ( ) . equals ( asker . getId ( ) ) & & assignmentInstance . isAccepted ( ) ) ) {
2021-01-06 16:50:08 +01:00
return new ResponseEntity < > ( " Some of problems appeared. Check if you have access to given assignment and if it is accepted or the exchange has not been already added. " , HttpStatus . BAD_REQUEST ) ;
2021-01-06 16:23:18 +01:00
}
2021-01-06 14:50:34 +01:00
2021-01-06 16:50:08 +01:00
this . exchangeService . save ( new Exchange ( assignmentInstance , groupInstance ) ) ;
2021-01-06 14:34:25 +01:00
2021-01-06 16:23:18 +01:00
return new ResponseEntity < > ( " Success " , HttpStatus . OK ) ;
2021-01-06 13:40:04 +01:00
}
2021-01-06 16:50:08 +01:00
2021-01-07 16:01:25 +01:00
@DeleteMapping ( " /exchange/{id} " )
@ApiOperation ( value = " Delete exchange offer " )
public ResponseEntity < String > deleteExchange ( @PathVariable ( name = " id " , required = false ) Long offerId )
throws UserNotFoundException {
final User asker = this . getCurrentUser ( )
. orElseThrow ( ( ) - > new UserNotFoundException ( " Invalid token " ) ) ;
final Optional < Exchange > exchange = this . exchangeService . getById ( offerId ) ;
if ( exchange . isEmpty ( ) ) {
return new ResponseEntity < > ( " Given offer does not exist. " , HttpStatus . BAD_REQUEST ) ;
}
final Exchange exchangeToDelete = exchange . get ( ) ;
if ( ! ( exchangeToDelete . getOwnedAssignment ( ) . getCommision ( ) . getCommisionOwner ( ) . getId ( ) . equals ( asker . getId ( ) ) ) ) {
return new ResponseEntity < > ( " You have not permission for that action. " , HttpStatus . BAD_REQUEST ) ;
}
2021-01-06 16:50:08 +01:00
2021-01-07 16:01:25 +01:00
this . exchangeService . deleteExchange ( exchangeToDelete ) ;
return new ResponseEntity < > ( " Success " , HttpStatus . OK ) ;
}
2021-01-07 16:51:35 +01:00
@GetMapping ( " /exchange/all " )
@ApiOperation ( value = " Get exchange offers " )
public ResponseEntity < List < ExchangeResponse > > getExchange ( )
throws UserNotFoundException {
final User asker = this . getCurrentUser ( )
. orElseThrow ( ( ) - > new UserNotFoundException ( " Invalid token " ) ) ;
final List < Exchange > response = exchangeService . getByUserId ( asker . getId ( ) ) ;
final List < ExchangeResponse > listOfResponses = ExchangeResponseMappers . mapToDefaultResponse ( response ) ;
return new ResponseEntity < > ( listOfResponses , HttpStatus . OK ) ;
}
2021-01-07 17:02:12 +01:00
@GetMapping ( " /exchange/{id} " )
@ApiOperation ( value = " Get exchange offers " )
public ResponseEntity < ExchangeResponse > getExchangeById ( @PathVariable ( name = " id " , required = false ) Long offerId )
throws UserNotFoundException {
final User asker = this . getCurrentUser ( )
. orElseThrow ( ( ) - > new UserNotFoundException ( " Invalid token " ) ) ;
final Optional < Exchange > exchange = this . exchangeService . getById ( offerId ) ;
if ( exchange . isEmpty ( ) ) {
return new ResponseEntity < > ( null , HttpStatus . BAD_REQUEST ) ;
}
final Exchange exchangeInstance = exchange . get ( ) ;
if ( ! exchangeInstance . getOwnerId ( ) . equals ( asker . getId ( ) ) ) {
return new ResponseEntity < > ( null , HttpStatus . BAD_REQUEST ) ;
}
return new ResponseEntity < > ( new ExchangeResponse ( exchangeInstance ) , HttpStatus . OK ) ;
}
2021-01-06 13:40:04 +01:00
}