Newer
Older
tampopotest / src / main / java / com / example / tampopotest / web / UserFriendsResource.java
package com.example.tampopotest.web;

import com.example.tampopotest.service.InMemoryStore;
import com.example.tampopotest.service.InMemoryStore.User;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.LinkedHashMap;
import java.util.Map;

@Path("/users/{user-id}/friends")
@Produces(MediaType.APPLICATION_JSON)
public class UserFriendsResource {
    private final InMemoryStore store = InMemoryStore.get();

    // GET /users/{user-id}/friends
    @GET
    public Response listPairs(@PathParam("user-id") String userId,
                              @QueryParam("token") String token) {
        if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
        User u = store.getUser(userId);
        if (u == null) return Response.status(Response.Status.NOT_FOUND).build();
        if (!store.verifyToken(userId, token)) return Response.status(403).build();
        Map<Integer, Map<String, String>> map = store.listFriendPairsOf(userId);
        // OpenAPIではpid1: {...} のような形を要求。キーをそのまま文字列にする
        Map<String, Object> res = new LinkedHashMap<>();
        for (Map.Entry<Integer, Map<String, String>> e : map.entrySet()) {
            res.put("pid" + e.getKey(), e.getValue());
        }
        return Response.ok(res).build();
    }

    // GET /users/{user-id}/friends/{pair-id}
    @GET
    @Path("/{pair-id}")
    public Response getOpponent(@PathParam("user-id") String userId,
                                @PathParam("pair-id") int pairId,
                                @QueryParam("token") String token) {
        if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
        if (!store.verifyToken(userId, token)) return Response.status(403).build();
        String other = store.friendOpponent(userId, pairId);
        if (other == null) return Response.status(Response.Status.NOT_FOUND).build();
        return Response.ok(Map.of("user-id", other)).build();
    }

    // DELETE /users/{user-id}/friends/{pair-id}
    @DELETE
    @Path("/{pair-id}")
    public Response deletePair(@PathParam("user-id") String userId,
                               @PathParam("pair-id") int pairId,
                               @QueryParam("token") String token) {
        if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
        if (!store.verifyToken(userId, token)) return Response.status(403).build();
        boolean ok = store.deleteFriendPair(pairId);
        if (!ok) return Response.status(Response.Status.NOT_FOUND).build();
        return Response.ok().build();
    }
}