Newer
Older
tampopotest / src / main / java / com / example / tampopotest / web / FriendsResource.java
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();
    }
}