diff --git a/src/main/java/me/akito123321/valoStrats/db/repositories/StratStateRepository.java b/src/main/java/me/akito123321/valoStrats/db/repositories/StratStateRepository.java new file mode 100644 index 0000000..f6fa701 --- /dev/null +++ b/src/main/java/me/akito123321/valoStrats/db/repositories/StratStateRepository.java @@ -0,0 +1,9 @@ +package me.akito123321.valoStrats.db.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; + +import me.akito123321.valoStrats.schemas.StratState; + +public interface StratStateRepository extends JpaRepository{ + +} diff --git a/src/main/java/me/akito123321/valoStrats/rest/controller/GroupRestAPI.java b/src/main/java/me/akito123321/valoStrats/rest/controller/GroupRestAPI.java index 857aea2..e6c24cc 100644 --- a/src/main/java/me/akito123321/valoStrats/rest/controller/GroupRestAPI.java +++ b/src/main/java/me/akito123321/valoStrats/rest/controller/GroupRestAPI.java @@ -19,16 +19,22 @@ import org.springframework.web.bind.annotation.RestController; import me.akito123321.valoStrats.rest.requests.GroupRequest; import me.akito123321.valoStrats.rest.requests.StratRequest; +import me.akito123321.valoStrats.rest.requests.StratStateRequest; import me.akito123321.valoStrats.rest.services.GroupService; import me.akito123321.valoStrats.rest.services.StratService; +import me.akito123321.valoStrats.rest.services.StratStateService; import me.akito123321.valoStrats.rest.util.JDBCUserDetailsService; import me.akito123321.valoStrats.schemas.Group; import me.akito123321.valoStrats.schemas.Strat; +import me.akito123321.valoStrats.schemas.StratState; import me.akito123321.valoStrats.schemas.StratsUser; @RestController @RequestMapping("/api/group") public class GroupRestAPI { + + @Autowired + private StratStateService stratStateService; @Autowired private JDBCUserDetailsService userService; @@ -39,7 +45,7 @@ public class GroupRestAPI { @Autowired private StratService stratService; - @PostMapping("/") + @PostMapping() public ResponseEntity createGroup(@RequestBody GroupRequest request) { StratsUser user = getUser(); Group group = new Group(request.name(), user); @@ -47,7 +53,7 @@ public class GroupRestAPI { return ResponseEntity.ok(group); } - @GetMapping("/") + @GetMapping() public ResponseEntity> getGroups() { StratsUser user = getUser(); List groups = user.getGroups(); @@ -113,7 +119,7 @@ public class GroupRestAPI { if (group == null) { return ResponseEntity.notFound().build(); } - if (!group.getOwner().getUsername().equals(user.getUsername())) { + if (!group.getOwner().equals(user)) { return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); } @@ -144,7 +150,7 @@ public class GroupRestAPI { } @PostMapping("/{id}/strat") - public ResponseEntity addStrat(@PathVariable String id, @RequestBody StratRequest strat) { + public ResponseEntity addStrat(@PathVariable String id, @RequestBody StratRequest stratRequest) { StratsUser user = getUser(); Group group = groupService.getGroupById(id); @@ -155,8 +161,12 @@ public class GroupRestAPI { return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); } - group.getStrats().add(new Strat(strat.title(), strat.description(), group, strat.stratStates())); + Strat strat = new Strat(stratRequest.title(), stratRequest.description(), group); + stratService.saveStrat(strat); + + group.getStrats().add(strat); + groupService.saveGroup(group); return ResponseEntity.ok(group); @@ -178,6 +188,8 @@ public class GroupRestAPI { if (strat == null) { return ResponseEntity.notFound().build(); } + + stratService.removeStrat(strat); group.getStrats().remove(strat); @@ -186,7 +198,7 @@ public class GroupRestAPI { return ResponseEntity.ok(group); } - @PatchMapping("/{id}/strat/{stratId}") + @PutMapping("/{id}/strat/{stratId}") public ResponseEntity editStrat(@PathVariable String id, @PathVariable String stratId, @RequestBody StratRequest newStrat) { StratsUser user = getUser(); @@ -216,6 +228,91 @@ public class GroupRestAPI { return ResponseEntity.ok(group); } + @PostMapping("/{id}/strat/{stratId}/strat-state") + public ResponseEntity addStratState(@PathVariable String id, @PathVariable String stratId , @RequestBody StratStateRequest stratStateRequest) { + StratsUser user = getUser(); + + Group group = groupService.getGroupById(id); + Strat strat = stratService.getStratById(stratId); + + if (group == null | strat == null) { + return ResponseEntity.notFound().build(); + } + if (!group.getMembers().contains(user)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + if(!group.getStrats().contains(strat)) { + return ResponseEntity.badRequest().build(); + } + + StratState stratState = new StratState(stratStateRequest.description(), strat); + + stratStateService.saveStratState(stratState); + + strat.getStratStates().add(stratState); + + stratService.saveStrat(strat); + groupService.saveGroup(group); + + return ResponseEntity.ok(group); + } + + @DeleteMapping("/{id}/strat/{stratId}/strat-state/{stratStateId}") + public ResponseEntity removeStratState(@PathVariable String id, @PathVariable String stratId, @PathVariable String stratStateId) { + StratsUser user = getUser(); + + Group group = groupService.getGroupById(id); + Strat strat = stratService.getStratById(stratId); + StratState stratState = stratStateService.getStratStateById(stratStateId); + + if (group == null | strat == null | stratState == null) { + return ResponseEntity.notFound().build(); + } + if (!group.getMembers().contains(user)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + if(!group.getStrats().contains(strat) | !strat.getStratStates().contains(stratState)) { + return ResponseEntity.badRequest().build(); + } + + stratStateService.removeStratState(stratState); + + strat.getStratStates().remove(stratState); + + stratService.saveStrat(strat); + groupService.saveGroup(group); + + return ResponseEntity.ok(group); + } + + @PutMapping("/{id}/strat/{stratId}/strat-state/{stratStateId}") + public ResponseEntity editStratState(@PathVariable String id, @PathVariable String stratId, @PathVariable String stratStateId, @RequestBody StratStateRequest newStratState) { + StratsUser user = getUser(); + + Group group = groupService.getGroupById(id); + Strat strat = stratService.getStratById(stratId); + StratState stratState = stratStateService.getStratStateById(stratStateId); + + if (group == null | strat == null | stratState == null) { + return ResponseEntity.notFound().build(); + } + if (!group.getMembers().contains(user)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + if(!group.getStrats().contains(strat) | !strat.getStratStates().contains(stratState)) { + return ResponseEntity.badRequest().build(); + } + + stratState.setDescription(newStratState.description()); + stratState.setImage(newStratState.image()); + + stratStateService.saveStratState(stratState); + stratService.saveStrat(strat); + groupService.saveGroup(group); + + return ResponseEntity.ok(group); + } + private StratsUser getUser() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); diff --git a/src/main/java/me/akito123321/valoStrats/rest/requests/StratStateRequest.java b/src/main/java/me/akito123321/valoStrats/rest/requests/StratStateRequest.java new file mode 100644 index 0000000..1b520ea --- /dev/null +++ b/src/main/java/me/akito123321/valoStrats/rest/requests/StratStateRequest.java @@ -0,0 +1,9 @@ +package me.akito123321.valoStrats.rest.requests; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +public record StratStateRequest ( + @Size(max = 512, message = "{title longer than 50 chars}") @NotBlank String description, + byte[] image) { +} diff --git a/src/main/java/me/akito123321/valoStrats/rest/services/StratService.java b/src/main/java/me/akito123321/valoStrats/rest/services/StratService.java index 778fdfa..70f71ee 100644 --- a/src/main/java/me/akito123321/valoStrats/rest/services/StratService.java +++ b/src/main/java/me/akito123321/valoStrats/rest/services/StratService.java @@ -19,5 +19,9 @@ public class StratService { public void saveStrat(Strat strat) { stratRepository.save(strat); } + + public void removeStrat(Strat strat) { + stratRepository.delete(strat); + } } diff --git a/src/main/java/me/akito123321/valoStrats/rest/services/StratStateService.java b/src/main/java/me/akito123321/valoStrats/rest/services/StratStateService.java new file mode 100644 index 0000000..bcf17fd --- /dev/null +++ b/src/main/java/me/akito123321/valoStrats/rest/services/StratStateService.java @@ -0,0 +1,27 @@ +package me.akito123321.valoStrats.rest.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import me.akito123321.valoStrats.db.repositories.StratStateRepository; +import me.akito123321.valoStrats.schemas.StratState; + +@Service +public class StratStateService { + + @Autowired + private StratStateRepository stratStateRepository; + + public StratState getStratStateById(String id) { + return stratStateRepository.findById(id).orElse(null); + } + + public void saveStratState(StratState stratState) { + stratStateRepository.save(stratState); + } + + public void removeStratState(StratState stratState) { + stratStateRepository.delete(stratState); + } + +} diff --git a/src/main/java/me/akito123321/valoStrats/schemas/Group.java b/src/main/java/me/akito123321/valoStrats/schemas/Group.java index 7639374..0c299af 100644 --- a/src/main/java/me/akito123321/valoStrats/schemas/Group.java +++ b/src/main/java/me/akito123321/valoStrats/schemas/Group.java @@ -24,10 +24,10 @@ public class Group { private List members; @OneToMany(fetch = FetchType.EAGER) private List strats; - + @OneToMany(fetch = FetchType.EAGER) private List maps; - + @ManyToMany(fetch = FetchType.EAGER) private List profiles; @@ -36,6 +36,8 @@ public class Group { this.owner = owner; this.members = new ArrayList(); this.strats = new ArrayList(); + this.maps = new ArrayList(); + this.profiles = new ArrayList(); } public Group() { diff --git a/src/main/java/me/akito123321/valoStrats/schemas/Strat.java b/src/main/java/me/akito123321/valoStrats/schemas/Strat.java index c30e9eb..739dc16 100644 --- a/src/main/java/me/akito123321/valoStrats/schemas/Strat.java +++ b/src/main/java/me/akito123321/valoStrats/schemas/Strat.java @@ -1,5 +1,6 @@ package me.akito123321.valoStrats.schemas; +import java.util.ArrayList; import java.util.List; import jakarta.persistence.ElementCollection; @@ -30,11 +31,13 @@ public class Strat { @ManyToOne private Map map; - public Strat(String title, String description, Group group, List stratStates) { + public Strat(String title, String description, Group group) { this.title = title; this.description = description; this.group = group; - this.stratStates = stratStates; + this.stratStates = new ArrayList(); + this.stratStates = new ArrayList(); + this.playerTypes = new ArrayList(); } public Strat() { diff --git a/src/main/java/me/akito123321/valoStrats/schemas/StratState.java b/src/main/java/me/akito123321/valoStrats/schemas/StratState.java index 6a87c67..bacce85 100644 --- a/src/main/java/me/akito123321/valoStrats/schemas/StratState.java +++ b/src/main/java/me/akito123321/valoStrats/schemas/StratState.java @@ -1,5 +1,6 @@ package me.akito123321.valoStrats.schemas; +import java.util.ArrayList; import java.util.List; import jakarta.persistence.Column; @@ -23,16 +24,20 @@ public class StratState { @ManyToOne private Strat strat; + @Lob + @Column(length = Integer.MAX_VALUE) + private byte[] image; + @Lob @Column(length = Integer.MAX_VALUE) @ElementCollection(fetch = FetchType.EAGER) private List lineups; - public StratState(String description, Strat strat, List lineups) { + public StratState(String description, Strat strat) { super(); this.description = description; this.strat = strat; - this.lineups = lineups; + this.lineups = new ArrayList(); } public StratState() { @@ -58,5 +63,17 @@ public class StratState { public List getLineups() { return lineups; } - + + public void setStrat(Strat strat) { + this.strat = strat; + } + + public byte[] getImage() { + return image; + } + + public void setImage(byte[] image) { + this.image = image; + } + }