feat: add resource REST endpoints

This commit is contained in:
dualfroz committed 2026-08-24 18:50:58 +02:00
1 parent f00085ba22
commit 3bf5fc8940
3 files changed
+111

No files matched your search

@@ -0,0 +1,67 @@
package com.slotline.resource;
import com.slotline.resource.dto.ResourceRequest;
import com.slotline.resource.dto.ResourceResponse;
import com.slotline.security.AuthenticatedUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/resources")
@Tag(name = "Resources")
public class ResourceController {
private final ResourceService resourceService;
public ResourceController(ResourceService resourceService) {
this.resourceService = resourceService;
}
@GetMapping
@Operation(summary = "List bookable resources in the caller's organization")
public List<ResourceResponse> list(@AuthenticationPrincipal AuthenticatedUser actor) {
return resourceService.findAll(actor.organizationId());
}
@GetMapping("/{id}")
@Operation(summary = "Get a single resource")
public ResourceResponse get(@AuthenticationPrincipal AuthenticatedUser actor, @PathVariable Long id) {
return resourceService.findById(actor.organizationId(), id);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
@Operation(summary = "Create a resource (ADMIN only)")
public ResourceResponse create(@AuthenticationPrincipal AuthenticatedUser actor,
@Valid @RequestBody ResourceRequest request) {
return resourceService.create(actor.organizationId(), request);
}
@PutMapping("/{id}")
@Operation(summary = "Update a resource (ADMIN only)")
public ResourceResponse update(@AuthenticationPrincipal AuthenticatedUser actor, @PathVariable Long id,
@Valid @RequestBody ResourceRequest request) {
return resourceService.update(actor.organizationId(), id, request);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@Operation(summary = "Delete a resource (ADMIN only)")
public void delete(@AuthenticationPrincipal AuthenticatedUser actor, @PathVariable Long id) {
resourceService.delete(actor.organizationId(), id);
}
}
@@ -0,0 +1,16 @@
package com.slotline.resource.dto;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public record ResourceRequest(
@NotBlank @Size(max = 128) String name,
@Size(max = 512) String description,
@Size(max = 64) String zoneId,
@Min(0) Integer bufferMinutes) {
public ResourceRequest(String name, String description) {
this(name, description, null, null);
}
}
@@ -0,0 +1,28 @@
package com.slotline.resource.dto;
import com.slotline.resource.Resource;
import java.time.Instant;
public record ResourceResponse(
Long id,
Long organizationId,
Long groupId,
String name,
String description,
String zoneId,
int bufferMinutes,
Instant createdAt) {
public static ResourceResponse from(Resource resource) {
return new ResourceResponse(
resource.getId(),
resource.getOrganizationId(),
resource.getGroupId(),
resource.getName(),
resource.getDescription(),
resource.getZoneId(),
resource.getBufferMinutes(),
resource.getCreatedAt());
}
}