package com.example.tampopotest.web;
import com.example.tampopotest.service.InMemoryStore;
import com.example.tampopotest.service.InMemoryStore.FriendPair;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.*;
@Path("/friends")
@Produces(MediaType.APPLICATION_JSON)
public class FriendsResource {
private final InMemoryStore store = InMemoryStore.get();
// POST /friends/
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createPair(@FormParam("token") String token,
@FormParam("user0-id") String user0,
@FormParam("user1-id") String user1) {
if (token == null || user0 == null || user1 == null) return Response.status(Response.Status.BAD_REQUEST).build();
String tokenUser = store.findUserIdByToken(token);
if (tokenUser == null) return Response.status(Response.Status.UNAUTHORIZED).build();
if (!tokenUser.equals(user0) && !tokenUser.equals(user1)) return Response.status(Response.Status.FORBIDDEN).build();
if (store.getUser(user0) == null || store.getUser(user1) == null) return Response.status(Response.Status.NOT_FOUND).build();
if (store.existsFriendPair(user0, user1)) return Response.status(409).build();
int pid = store.createFriendPair(user0, user1);
Map<String, Object> res = Map.of("pair-id", pid);
return Response.ok(res).build();
}
// GET /friends/pairs/{pair-id}/
@GET
@Path("/pairs/{pair-id}/")
public Response getPair(@PathParam("pair-id") int pairId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
String user = store.findUserIdByToken(token);
if (user == null) return Response.status(Response.Status.UNAUTHORIZED).build();
FriendPair p = store.getFriendPair(pairId);
if (p == null) return Response.status(Response.Status.NOT_FOUND).build();
if (!p.user0Id.equals(user) && !p.user1Id.equals(user)) return Response.status(Response.Status.FORBIDDEN).build();
Map<String, Object> res = new LinkedHashMap<>();
res.put("id", p.pairId);
res.put("user0id", p.user0Id);
res.put("user1Id", p.user1Id);
return Response.ok(res).build();
}
// DELETE /friends/pairs/{pair-id}/
@DELETE
@Path("/pairs/{pair-id}/")
public Response deletePair(@PathParam("pair-id") int pairId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
String user = store.findUserIdByToken(token);
if (user == null) return Response.status(Response.Status.UNAUTHORIZED).build();
FriendPair p = store.getFriendPair(pairId);
if (p == null) return Response.status(Response.Status.NOT_FOUND).build();
if (!p.user0Id.equals(user) && !p.user1Id.equals(user)) return Response.status(Response.Status.FORBIDDEN).build();
store.deleteFriendPair(pairId);
return Response.ok().build();
}
// GET /friends/users/{user-id}
@GET
@Path("/users/{user-id}")
public Response listFriends(@PathParam("user-id") String userId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
if (!token.equals(Optional.ofNullable(store.getUser(userId)).map(u -> u.token).orElse(null))) {
return Response.status(Response.Status.FORBIDDEN).build();
}
if (store.getUser(userId) == null) return Response.status(Response.Status.NOT_FOUND).build();
List<String> list = store.listFriends(userId);
return Response.ok(list).build();
}
}