Skip to content

Commit 83e463a

Browse files
authored
Merge pull request #72 from w8385/feat/add-endpoints
엔드포인트 및 모델 추가
2 parents 22a5cd3 + d528af8 commit 83e463a

20 files changed

+803
-1
lines changed

.prettierrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
22
"singleQuote": true,
3-
"plugins": ["@typespec/prettier-plugin-typespec"]
3+
"plugins": [
4+
"@typespec/prettier-plugin-typespec"
5+
]
46
}

src/models/Post.tsp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace SolvedAC;
2+
3+
/**
4+
* solved.ac의 게시글입니다.
5+
*/
6+
model Post {
7+
/**
8+
* 게시글의 아이디입니다.
9+
* @example "rules_v1"
10+
*/
11+
postId: string;
12+
13+
/**
14+
* 게시글의 제목입니다.
15+
* @example "solved.ac 이용 규칙 – v1"
16+
*/
17+
title: string;
18+
19+
/**
20+
* 게시글의 내용입니다.
21+
* @example "이 규칙은 2020년 3월 1일부터 유효합니다.\n\n## 1\\. 난이도 기여\n\n난이도 기여는 난이도 기여 가이드라인을 기반으로 자신이 해당 문제를 해결하고 느낀 난이도를 솔직하게 표현해야 합니다. 다음과 같은 난이도 기여는 운영진 판단 하에 임의로 삭제될 수 있습니다.\n\n**a**. 특정 문제에 다른 이용자 대부분이 납득하기 힘든 난이도를 매긴 경우\n\n* 예: 1000번 문제에 Ruby I을 기여, 8481번 문제에 Bronze V를 기여\n* 2020년 이전 기여 중 Platinum과 Silver를 헷갈린 기여는 예외로 합니다.\n* 이와 같은 기여를 자신의 티어를 올릴 목적으로 한 경우, 기여가 삭제되는 것은 물론 해당 문제에 대한 경험치가 영구적으로 반영되지 않게 될 수 있습니다.\n\n**b**. 특정 문제를 해결하는 것과 관련이 없거나 도움이 전혀 되지 않는 태그를 단 경우\n* 예: 1003번 문제에 tag:dijkstra를 닮\n* 난이도 기여 전체를 삭제하는 대신, 해당 태그만 삭제될 수도 있습니다.\n* 문제와 관련 없는 태그를 납득하기 힘들 정도로 많이 달았다면 이용자에게 혼란을 주기 위함이라고 판단될 수 있습니다.\n\n**c**. 난이도 기여 경험치를 얻기 위한 목적으로, 자동화 스크립트 등을 사용해 자신이 푼 문제에 난이도를 일괄적으로 매기는 경우\n\n**d**. 경험치를 얻기 위한 목적으로, 정상적이지 않은 방법으로 난이도 기여를 한 경우\n* 정상적이지 않은 방법으로 난이도 기여가 가능함을 발견한 경우 shift@solved.ac로 즉시 신고 바랍니다. 프로필에 뱃지를 달아 드립니다.\n\n**e**. 동일인이 다중 계정을 사용해 한 문제에 1건 초과의 기여를 남긴 경우\n\n## 2. 난이도 기여 의견\n\n난이도 기여 의견은 문제 출제자들과 다른 기여자들, 그리고 문제를 푸는 사람들에 대한 존중을 바탕으로 작성되어야 합니다. 다음과 같은 의견은 운영진 판단 하에 임의로 삭제될 수 있습니다.\n\n**a**. 인종, 성, 성적 지향, 지역, 종교, 교육 수준, 생활 수준 등에 기반해 혐오적인 내용을 담고 있는 경우\n\n**b**. 출제자, 다른 기여자, 또는 문제를 푸는 사람들에 대한 비하적인 내용을 담고 있는 경우\n\n**c**. 욕설을 담고 있는 경우\n\n**d**. 문제 혹은 문제 해결과 관련이 없는 내용을 적은 경우\n\n## 3. 소스 코드 윤리\n\n다음과 같은 행위를 한 경우 운영진 판단 하에 사용 제재를 가할 수 있습니다.\n\n**a**. 경험치를 올릴 목적으로 다른 사람의 소스 코드를 그대로 혹은 수정을 가해 제출하는 행위\n\n## 4. 이벤트 참가\n\n동일인이 다중 계정을 사용해 이벤트 등에 참가할 경우 보상 획득을 임의로 제한할 수 있습니다.\n\n## 5. 아레나\n\n**a**. 아레나 참가 중에는 다른 참가자와 문제에 대해 의논하면 안 됩니다.\n\n**b**. 아레나는 1인당 한 개의 계정으로만 참가할 수 있습니다. 단, 다음의 예외를 허용합니다.\n- 이전에 다른 계정으로 아레나에 참가한 적 있을 경우, 이전 계정을 더 이상 사용하지 않으려는 경우에만 새 계정으로 참가할 수 있습니다.\n\n**c**. 동시에 두 개 이상의 다중 계정으로 아레나에 참가하면 안 됩니다.\n\n**d**. 아레나 참가 중 제출한 소스 코드는 대회 시작 시점 이전에 작성한 것이어도 괜찮습니다. 단, 제출한 코드는 제3자의 저작권 등의 권리를 침해하지 않아야 합니다.\n\n**e**. Open Contest 아레나 등, 앞서 또는 동시에 같은 문제들을 포함하여 개최된 대회가 있는 경우, 해당 대회의 참가자는 아레나에 참가하면 안 됩니다.\n\n**f**. 아레나에 참가하고자 하는 경우 대회 시작 5분 전까지 등록을 마쳐야 합니다.\n\n## 제재\n위의 사항을 위반해 기여가 삭제된 경우, 위반 행위의 심각성을 따져 추가적인 제재가 가해질 수 있습니다.\n\n* **1.c.**, **1.d.**\n - 난이도 기여 영구 제한 및 사이트 이용 제한.\n* **1.e.**\n - (해당하는 다중 계정에 대해) 난이도 기여 영구 제한.\n* **2.a.**, **2.b.**, **2.c.**\n - 난이도 기여 30일 제한. 최근 365일간 3회 이상 반복되었을 경우 난이도 기여 영구 제한.\n* **1.a.**, **1.b.**, **2.d.**\n - 악의가 있다고 판단될 경우, 난이도 기여 7일 제한 및 해당 문제에 대해 난이도 기여 영구 제한. 최근 365일간 5회 이상 반복되었을 경우 난이도 기여 영구 제한.\n* **3.a.**\n - 해당 계정의 경험치, 레이팅, CLASS를 영구히 0으로 설정.\n - 레이팅을 0으로 설정하는 기간 동안 이벤트 등에 참가하더라도 보상을 부여하지 않으며, 순위 집계 시 해당 유저를 제외함.\n* **5.a.**, **5.b.**, **5.c.**, **5.d.**, **5.e.**\n - 해당 계정의 아레나 레이팅을 영구히 0으로 설정.\n\n추가로, 운영진 판단 하에 규칙을 위반한 해당 사용자의 기여를 전부 삭제하거나 사이트 이용을 영구 제한할 수 있습니다."
22+
*/
23+
content: string;
24+
25+
/**
26+
* 게시글이 작성된 언어입니다.
27+
*/
28+
language: string;
29+
30+
/**
31+
* 게시글 내용의 타입입니다.
32+
*/
33+
type: string;
34+
}

src/models/UserAdditionalInfo.tsp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
namespace SolvedAC;
2+
3+
/**
4+
* solved.ac 사용자 부가 정보입니다.
5+
*/
6+
model UserAdditionalInfo {
7+
/**
8+
* 사용자의 국가/지역 코드입니다.
9+
*
10+
* @example "kr"
11+
*/
12+
countryCode: string;
13+
14+
/**
15+
* 사용자의 성별입니다.
16+
* - 0: 선택 안 함
17+
* - 1: 남성
18+
* - 2: 여성
19+
* - 9: 기타
20+
*
21+
* @example 0
22+
*/
23+
gender: uint64;
24+
25+
/**
26+
* 사용자를 영어로 표기할 때 사용하는 대명사입니다.
27+
*
28+
* @example "he/him"
29+
*/
30+
pronouns: string;
31+
32+
/**
33+
* 사용자의 생년입니다.
34+
*
35+
* @example 1998
36+
*/
37+
birthYear: uint64;
38+
39+
/**
40+
* 사용자의 생월입니다.
41+
*
42+
* @example 8
43+
*/
44+
birthMonth: uint64;
45+
46+
/**
47+
* 사용자의 생일입니다.
48+
*
49+
* @example 6
50+
*/
51+
birthDay: uint64;
52+
53+
/**
54+
* 사용자의 영어 이름입니다.
55+
*
56+
* @example "Suhyun Park"
57+
*/
58+
name: string;
59+
60+
/**
61+
* 사용자의 모국어 이름입니다.
62+
*
63+
* @example "박수현"
64+
*/
65+
nameNative: string;
66+
}

src/models/_barrel.tsp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ import "./Organization.tsp";
2525
import "./OrganizationType.tsp";
2626
import "./Ranked.tsp";
2727
import "./Emoticon.tsp";
28+
import "./UserAdditionalInfo.tsp";
29+
import "./Post.tsp";

src/operations/_barrel.tsp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import "./account/_barrel.tsp";
22
import "./background/_barrel.tsp";
33
import "./badge/_barrel.tsp";
44
import "./coins/_barrel.tsp";
5+
import "./organization/_barrel.tsp";
6+
import "./post/_barrel.tsp";
57
import "./problem/_barrel.tsp";
68
import "./ranking/_barrel.tsp";
79
import "./search/_barrel.tsp";
810
import "./site/_barrel.tsp";
11+
import "./tag/_barrel.tsp";
912
import "./user/_barrel.tsp";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "./show.tsp";

src/operations/organization/show.tsp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 해당 ID의 단체 정보를 가져옵니다.
8+
*
9+
* @return
10+
* 단체 정보를 가져옵니다.
11+
*/
12+
@summary("단체 ID로 단체 정보 가져오기")
13+
@tag("organization")
14+
@get
15+
@route("/organization/show")
16+
op getOrganizationById(
17+
/**
18+
* 요청할 단체의 ID
19+
*/
20+
@query
21+
organizationId: string,
22+
): GetOrganizationById.Ok;
23+
24+
namespace GetOrganizationById {
25+
@extension(XInternal, true)
26+
model Ok {
27+
@statusCode status: 200;
28+
@body organization: Organization;
29+
}
30+
}

src/operations/post/_barrel.tsp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "./show.tsp";

src/operations/post/show.tsp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 해당 제목의 게시글을 가져옵니다.
8+
*
9+
* @return
10+
* 게시글을 가져옵니다.
11+
*/
12+
@summary("게시글 제목으로 게시글 가져오기")
13+
@tag("post")
14+
@get
15+
@route("/post/show")
16+
op getPostById(
17+
/**
18+
* 응답을 받을 언어입니다.
19+
*/
20+
@header
21+
`x-solvedac-language`?: Language,
22+
23+
/**
24+
* 요청할 게시글의 제목
25+
*/
26+
@query
27+
postId: string,
28+
): GetPostById.Ok;
29+
30+
namespace GetPostById {
31+
@extension(XInternal, true)
32+
model Ok {
33+
@statusCode status: 200;
34+
@body post: Post;
35+
}
36+
}

src/operations/ranking/_barrel.tsp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ import "./reverse_rival.tsp";
55
import "./rival.tsp";
66
import "./tier.tsp";
77
import "./organization.tsp";
8+
import "./in_organization.tsp";
9+
import "./arena_in_organization.tsp";
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 해당 단체에 속한 사용자 중에서 아레나 레이팅이 높은 사용자가 먼저 오도록 정렬한 목록을 가져옵니다.
8+
*
9+
* @return
10+
* 페이지네이션 가능한 사용자 목록을 반환합니다.
11+
*/
12+
@summary("아레나 레이팅 순 단체 내 랭킹 가져오기")
13+
@tag("ranking")
14+
@get
15+
@route("/ranking/arena_in_organization")
16+
op getRankingByArenaRatingInOrganization(
17+
/**
18+
* 단체 ID
19+
*/
20+
@query
21+
organizationId: uint32,
22+
23+
/**
24+
* 페이지
25+
*/
26+
@query
27+
page?: uint32,
28+
): GetRankingByArenaRatingInOrganization.Ok;
29+
30+
namespace GetRankingByArenaRatingInOrganization {
31+
@extension(XInternal, true)
32+
model Ok {
33+
@statusCode status: 200;
34+
@body data: PaginatedList<User>;
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 해당 단체에 속한 사용자 중에서 문제풀이 레이팅이 높은 사용자가 먼저 오도록 정렬한 목록을 가져옵니다.
8+
*
9+
* @return
10+
* 페이지네이션 가능한 사용자 목록을 반환합니다.
11+
*/
12+
@summary("문제풀이 레이팅 순 단체 내 랭킹 가져오기")
13+
@tag("ranking")
14+
@get
15+
@route("/ranking/in_organization")
16+
op getRankingByACRatingInOrganization(
17+
/**
18+
* 단체 ID
19+
*/
20+
@query
21+
organizationId: uint32,
22+
23+
/**
24+
* 페이지
25+
*/
26+
@query
27+
page?: uint32,
28+
): GetRankingByACRatingInOrganization.Ok;
29+
30+
namespace GetRankingByACRatingInOrganization {
31+
@extension(XInternal, true)
32+
model Ok {
33+
@statusCode status: 200;
34+
@body data: PaginatedList<User>;
35+
}
36+
}

src/operations/tag/_barrel.tsp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import "./list.tsp";
2+
import "./show.tsp";

src/operations/tag/list.tsp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 태그 목록을 가져옵니다.
8+
*
9+
* @return
10+
* 태그 목록을 가져옵니다.
11+
*/
12+
@summary("태그 목록 가져오기")
13+
@tag("tag")
14+
@get
15+
@route("/tag/list")
16+
op getTagList(
17+
/**
18+
* 페이지
19+
*/
20+
@query
21+
page?: uint32,
22+
): GetTagList.Ok;
23+
24+
namespace GetTagList {
25+
@extension(XInternal, true)
26+
model Ok {
27+
@statusCode status: 200;
28+
@body data: PaginatedList<ProblemTag>;
29+
}
30+
}

src/operations/tag/show.tsp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 태그 ID로 태그 정보를 가져옵니다.
8+
*
9+
* @return
10+
* 태그 정보를 가져옵니다.
11+
*/
12+
@summary("태그 ID로 태그 정보 가져오기")
13+
@tag("tag")
14+
@get
15+
@route("/tag/show")
16+
op getTagByKey(
17+
/**
18+
* 태그 ID
19+
*/
20+
@query
21+
key: string,
22+
): GetTagByKey.Ok;
23+
24+
namespace GetTagByKey {
25+
@extension(XInternal, true)
26+
model Ok {
27+
@statusCode status: 200;
28+
@body tag: ProblemTag;
29+
}
30+
}

src/operations/user/_barrel.tsp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ import "./show.tsp";
22
import "./top_100.tsp";
33
import "./organizations.tsp";
44
import "./problem_stats.tsp";
5+
import "./additional_info.tsp";
6+
import "./class_stats.tsp";
7+
import "./contribution_stats.tsp";
8+
import "./problem_tag_stats.tsp";
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using TypeSpec.Http;
2+
using TypeSpec.OpenAPI;
3+
4+
namespace SolvedAC;
5+
6+
/**
7+
* 해당 핸들을 가진 사용자의 부가 정보를 가져옵니다.
8+
*
9+
* @return
10+
* 사용자 부가 정보를 가져옵니다
11+
*/
12+
@summary("사용자 핸들로 부가 정보 가져오기")
13+
@tag("user")
14+
@get
15+
@route("/user/additional_info")
16+
op getUserAdditionalInfo(
17+
/**
18+
* 요청할 사용자명
19+
*/
20+
@query
21+
handle: string,
22+
): GetUserAdditionalInfo.Ok;
23+
24+
namespace GetUserAdditionalInfo {
25+
@extension(XInternal, true)
26+
model Ok {
27+
@statusCode status: 200;
28+
@body userAdditionalInfo: UserAdditionalInfo;
29+
}
30+
}

0 commit comments

Comments
 (0)