-
Notifications
You must be signed in to change notification settings - Fork 1
Feed API Specification
BangDori edited this page Apr 15, 2024
·
32 revisions
๊ธฐ๋ฅ | ๋ฉ์๋ | URI | ๋น๊ณ |
---|---|---|---|
ํผ๋ ๋ชฉ๋ก ์กฐํ | GET | /feeds | |
ํผ๋ ์์ฑ | POST | /feeds | |
ํผ๋ ์์ธ | GET | /feeds/{feed_id} | |
ํผ๋ ๋๊ธ | GET | /feeds/{feed_id}/comments | |
ํผ๋ ์์ | PUT | /feeds/{feed_id} | |
ํ๋ก์ฐ ์ฌ๋ถ ํ์ธ | POST | /users | |
์ข์์ ๋ฐ ๋ถ๋งํฌ ์ฌ๋ถ ํ์ธ | POST | /feeds/{feed_id} | |
ํผ๋ ์ญ์ | DELETE | /feeds/{feed_id} | |
ํผ๋ ์ข์์ | POST | /feeds/{feed_id}/like | |
ํผ๋ ์ ๊ณ | POST | /feeds/{feed_id}/report | |
preSignedURL ์์ฒญ | . | . | โ |
S3 ์ด๋ฏธ์ง ์ ๋ก๋ | . | . | โ |
S3 ์ด๋ฏธ์ง ์ ๊ฑฐ | . | . | โ |
- โ : ํ์ธ ์๋ฃ
โ ๏ธ : ๋๊ธฐ ์ํ- โ: ๋ ผ์ ํ์
interface Image {
id: number;
imageUrl: string;
}
interface Feed {
id: number;
userId: number;
user: {
id: number;
profileImage: string;
name: string;
};
title: string;
content: string;
images: Image[];
likeCount: number;
commentCount: number;
is_like: boolean;
is_bookmark: boolean;
updatedAt: string;
}
interface Comment {
id: number;
user: {
id: number;
profileImage: string;
name: string;
relationshipStatus: "self" | "following" | "none"; // โ ๏ธ ์ถํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
};
content: string;
updatedAt: string;
}
interface Request {
uri: "/feeds?page=";
method: "GET";
query: {
page: string; // default = 1
};
body: {};
}
interface Response {
code: "2000";
data: {
feeds: Feed[]; // 0๏ธโฃ Feed
currentPageNumber: number; // ํ์ฌ ํ์ด์ง์ ์
pageSize: number; // ํ์ด์ง ํฌ๊ธฐ
numberOfElements: number; // ์ค์ ๋ฐ์ดํฐ์ ์
hasNext: boolean; // ๋ค์ ์กด์ฌํ๋์ง
};
}
interface Request {
uri: "/feeds";
method: "POST";
body: {
title: string;
content: string;
images: Image[];
scope: "public" | "friend" | "private";
};
}
interface Response {
code: "2000";
data: {};
}
// ํผ๋ ์์ธ ์ ๋ณด์ ๋ํ ์์ฒญ๊ณผ ์๋ต
interface Request {
uri: "/feeds/feed_id";
method: "GET";
body: {};
}
interface Response {
code: "2000";
data: {
feed: Feed; // 0๏ธโฃ Feed
};
}
// ๋๊ธ์ ๋ํ ์์ฒญ๊ณผ ์๋ต
interface Request {
uri: "/feeds/{feed_id}/comments";
method: "GET";
body {}
}
interface Response {
code: "2000";
data: {
comments: Comment[]; // 0๏ธโฃ Comment
};
}
interface Request {
uri: "/feeds/{feed_id}";
method: "PUT";
body: {
title: string;
content: string;
images: Image[];
scope: "public" | "friend" | "private";
};
}
interface Response {
code: "2000";
data: {};
}
interface Request {
uri: "/feeds/{feed_id}";
method: "DELETE";
body: {};
}
interface Response {
code: "2000";
data: {};
}
interface Request {
uri: "/feeds/{feed_id}/like";
method: "POST";
body: {};
}
interface Response {
code: "2000";
data: {};
}
interface Request {
uri: "/feeds/{feed_id}/report";
method: "POST";
body: {
category: string;
content: string;
isBlind: boolean;
};
}
interface Response {
code: "2000";
data: {};
}
interface Request {
uri: "/users";
method: "POST";
body: {
userId: number;
};
}
interface Response {
code: "2000";
data: {
relationshipStatus: "self" | "following" | "none"; // โ ๏ธ ์ถํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
};
}
interface Request {
uri: "/feeds/{feed_id}";
method: "POST";
body: {};
}
interface Response {
code: "2000";
data: {
likeCount: number;
commentCount: number;
};
}
- ์์ฑ ์๋ฃ, ์ข์์ ์ฑ๊ณต, ์ ๊ณ ์ฑ๊ณต์ ๋ํ ์๋ต ๋ฐ์ดํฐ๋ ๋ฌด์์ผ๋ก ์ค์ ํด์ผ ํ๋์? โ ํผ๋๋ฐฑ 4
- ๊ฒ์๋ฌผ, ์ ์ ์ ๊ฐ์ ๊ณ ์ Id ํ์
ํ์ ํ์ (
string
vsbigint
) โ ํผ๋๋ฐฑ 1 - ํ๋ก์ฐ ์ฌ๋ถ์ ์๊ธฐ ๊ฒ์๋ฌผ ์ฌ๋ถ์ ๋ํ ์ฌ๋ถ ์ฒดํน์ ๋ํ ๋ฐฉ๋ฒ
โ ๏ธ ์ถํ ๋ณ๊ฒฝ๊ฐ๋ฅ- ๋ณ์ ํ๋๋ก ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
relationshipStatus: 'self' | 'following' | 'none'
- ๋ณ์ ๋๊ฐ๋ก ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
isFollow: boolean
isSelfFeed: boolean
- ๋ณ์ ํ๋๋ก ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
- ๊ณต๊ฐ ๋ฒ์ ๋ณ์ ๋ช ์ด๋ค ๊ฑธ๋ก ์ ์ํ๋๊ฒ ์ข์๊น โ ํผ๋๋ฐฑ 5
- ์ ๊ณ ํ๊ธฐ ์ฌ์ ์ ๋ํ ๋ณ์๋ช ๊ณผ ํ์ ์ ์ด๋ป๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ข์๊น? โ ํผ๋๋ฐฑ 3
- ๋ชจ๋ id๋ number๋ก ๊ด๋ฆฌํด๋ ๋ฌด๋ฐฉํ ๋ฏ. BIGINT์ ๊ฐ์ด -9223372036854775808 ~ 9223372036854775807์ธ๋ฐ, unsigned๋ก ๊ด๋ฆฌํ๋ฉด ์ด ๊ฐ์ ๋์ ์ผ์ด ๊ฑฐ์ ์์ ๊ฒ์ด๋ผ ํ๋จ. (๋จ java ์์๋ BigInteger ํ์ ์ผ๋ก ์นํํด์ผ ํ ์๋ ์์ผ๋ ๊ณผ์ฐ Long ๋ฒ์๋ฅผ ๋์ ์ผ์ด ์์๊น?)
- API ์๋ต ๋ฐ์ดํฐ๋ ์ค๋ค์ดํฌ ์ผ์ด์ค๊ฐ ์๋, ์นด๋ฉ ์ผ์ด์ค๋ก ์ฌ์ฉ๋๋ค.
- ํ์ฌ ๋ฌธ์ํ๊ธฐ API์์๋ category๋ก ๋ถ๋ฅํ๊ณ ์์ผ๋ ํต์ผ์ฑ์ ์ํด ์ฌ๊ธฐ์์๋ category๋ก ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
-
images: string[];
-> ์ฌ์ง ๊ฒฝ๋ก๋ง ๋ฐ์์ค๋ฉด FE๋จ์์ key๊ฐ ๋ถ์ฌ๋ก ์ธํด ๊ด๋ฆฌ๊ฐ ํ๋ค์ง ์์์ง? id, url ํจ๊ป ๋๊ธฐ๋ ๋ฐฐ์ด ํ์ ์ ๋ณด๋ด์ค ์ ์์. ์๋ต ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค๋ฉด ๊ทธ์ ๋ง์ถ์ด ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ๋๋ฆฌ๊ฒ ์ง๋ง, ์๋ง ํ์์์ง ์์๊น์? ๊ทธ๋ด ๋๋ ๋ค์๊ณผ ๊ฐ์ ์๋ต ํฌ๋งท์ ๋ฐํํฉ๋๋ค.{ "code": "2000", "data": {} }
- BE์์๋ public, friend, private๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค.
- RESTful ๋ช ์ธ์ ์ํด ์์ฒญ url์ /feeds/{feed_id}, ์ฆ query param์ ์ฌ์ฉํ์ง ์์.
- ํผ๋ ์์ธ์์ ๊ตณ์ด feed์ comment๋ฅผ joinํ ํ์๊ฐ ์์์ง?
/feeds/{feed_id}
์/feeds/{feed_id}/comments
๋ฅผ ๋น๋๊ธฐ ์์ฒญ์ผ๋ก ๋ฐ๋ ๊ฒ ์๋ก ํธํ ๊ฑฐ๋ผ ์๊ฐํจ - Feed List์์ feedId๋ userId๋ฅผ ๋ฐ์์ฌ ์ ์์ผ๋๊น ์ด๊ฑธ๋ก ๊ฒ์๋ฌผ ์ ๋ณด ๋ณด์ฌ์ฃผ๊ณ , ๋ค์ ์์ฒญํด์ ์์ฑ์์์ ๊ด๊ณ ๋ฐ isLike, isBookMark ๋ฐ์์ค๊ฒ ํ๋ฉด ๋ ๋ฏ
- ์ด ๋ฐฉ๋ฒ์ด ์๋๋ผ๋ฉด Join ํ์๊ฐ ๋๋ฌด ๋ง์์ ธ์ ์คํ๋ ค ์๊ฐ์ด ๋ ๊ฑธ๋ฆด ์๋ ์์