-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodels.tsp
197 lines (154 loc) · 3.52 KB
/
models.tsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import "./utils.tsp";
import "./types.tsp";
/** 상속용 Post 클래스 */
model BasePost extends Identifiable {
/** 제목 */
title: string;
/** 카테고리 */
category: Category.Base;
/** 피드 배너 이미지 목록 */
@maxItems(10)
feeds: url[];
/** Post 상세 내용 */
@maxLength(2200)
caption: string;
/** 이벤트 유형 */
type: EventType;
/** 상세주소 */
location: string | null;
/** 연락처 */
contact: string | null;
/** 가격 */
pricing: uint64 | null;
/** 할인률 */
discountRate: uint64 | null;
/** 오픈일 */
startsAt: utcDateTime;
/** 종료일 */
endsAt: utcDateTime | null;
/** 출처 링크 */
link: url | null;
}
/** Post 생성 시 입력할 정보 */
model CreatePost extends OmitProperties<BasePost, "id"> {
/** Post를 생성할 기업의 ID */
companyId: id;
/** 태그 id 목록 */
tagIds: id[];
}
/** Post 수정 시 입력할 정보 */
alias UpdatePost = OptionalProperties<OmitProperties<
CreatePost,
"companyId"
>>;
/** Post 정보 */
model Post extends BasePost {
/** 게시일 */
createAt: utcDateTime;
/** Post를 등록한 기업 */
company: Company;
/** 태그 목록 */
tags: Tag[];
/** 좋아요 수 */
likes: uint64;
/** 조회수 */
views: uint64;
/** 현재 로그인된 사용자가 이미 좋아요한 Post인지 여부 */
isLiked: boolean;
/** 현재 로그인된 사용자가 이미 마이페이지에 저장한 Post인지 여부 */
isSaved: boolean;
}
/** 상속용 Company 클래스 */
model BaseCompany {
/** 기업명 */
name: string;
/** 기업 로고 */
logo: url;
/** 상태 */
active: boolean;
}
/** 기업정보 수정 시 입력할 정보 */
alias UpdateCompany = OptionalProperties<BaseCompany>;
/** 기업 정보 */
model Company extends BaseCompany {
...Identifiable;
}
/** 이미지 업로드 정보 */
model Image {
filename: string;
image: bytes;
}
/** 카테고리 관련 타입 */
namespace Category {
/** 카테고리 정보 */
model Base extends Identifiable {
...Create;
}
model Create {
/** 카테고리명 */
name: string;
}
}
/** 태그 관련 타입 */
namespace Tag {
/** 태그 정보 */
model Base extends Identifiable {
...Create;
}
model Create {
/** 태그명 */
name: string;
}
}
/** 상속용 UserProfile 클래스 */
model BaseUserProfile extends Identifiable {
/** 사용자 실명 */
name: string;
}
/**
* 상속용 User 클래스
*
* 주로 사용자가 회원가입 후 추가적으로 입력하는 개인정보들이 포함된다.
*/
model BaseUser extends BaseUserProfile {
/** 회원 성별 */
gender: Gender | null;
/** 이메일 */
@format("email")
email: string;
/** 전화번호 */
telephone: string | null;
/**
* 생년월일
*
* 형식은 [RFC 3339문서의 5.6 문단](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6)을 따른다.
*
* @example "2005-12-12"
*/
birth: plainDate | null;
}
/** 회원 정보 */
model User extends BaseUser {
/** 사용한 소셜 로그인 서비스 */
oAuthProvider: string;
/** 회원 가입일 */
createAt: utcDateTime;
/** 마지막 로그인 시점 */
lastLogin: utcDateTime;
}
/** User 수정 시 입력할 정보 */
alias UpdateUser = OptionalProperties<OmitProperties<
BaseUser,
"id"
>>;
/**
* 회원 프로필 정보
*
* 프로필 페이지에 보여줄 정보들이 포함된다.
*/
model UserProfile extends BaseUserProfile {
/** 사용자가 팔로우 중인 기업 목록 */
follows: Paginate<Company[]>;
/** 사용자가 저장한 포스트 목록 */
saved: Paginate<Post[]>;
}