Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HeXA HomePage Api 설계 #8

Open
gongbj0113 opened this issue Feb 7, 2023 · 6 comments
Open

HeXA HomePage Api 설계 #8

gongbj0113 opened this issue Feb 7, 2023 · 6 comments

Comments

@gongbj0113
Copy link

gongbj0113 commented Feb 7, 2023

HeXA HomePage Api 설계 2

💡 API 앞에 🆔 표기는 OAuth authentication이 필요한 API입니다. 파라미터에 Authorization 전달이 포함됩니다.

1. 로그인 / 유저

💡 OAuth 2 방식을 생각하고 작성했습니다

POST /user/create

💡 회원가입 API

parameter

{
	id:"hexaadmin",
	email: "[email protected]",
	gender: 0, // 0 : male | 1 : female
	state: 0, // 0 : 재학  |  1 : 휴학  |  2 : 졸업
	regYear: "1011",
	regNum: "2022", // 없으면 ""
	name:"김선욱",
	password1:"abcdefg",
	password2:"abcdefg",
}

POST /user/login

parameter

{
	userId:"hexaadmin",
	password:"abcdeg",
}

response

token_type:"bearer" 로 고정

{
	id:"hexaadmin",
	accessToken:"ABASFAFSDESDFSDFEF",
	refreshToken:"ABFADJFELKSDFKENHF",
}

🆔 GET /user/

💡 로그인되어 있는 유저의 데이터를 가져오는 API `id`은 로그인 아이디, `name` 은 사람 이름입니다. ⚠️ 이전에는 user_name, name, user_id(number) 이렇게 3 개가 있었는데, user_name이 없어지고 user_id가 이전의 user_name으로 대체되었습니다.

response

{
	id:"hexaadmin",
	name:"김선욱",
	email:"[email protected]",
	profileUrl:"https://imgurl.com/123123.png",
	authorization: "", // 권한. 도메인에 대한 논의가 아직 안되어 있음.
	position: "", // 직책. 도메인에 대한 논의가 아직 안되어 있음.
	gender:0, // 0 : male | 1 : female
	state: 0, // 0 : 재학  |  1 : 휴학  |  2 : 졸업
	regNum: "1101", // 학번. 데이터가 없으면 ""
	regYear: "2022", // 입학년도
	generation: 10, // 기수
	contactNumber: "", // 없을 시 빈 텍스트
	mainMajor: "", // 없을 시 빈 텍스트
	techStackList: ["java", "react", "flutter"],
	githubLink: "", // 없을 시 빈 텍스트
	snsList: [],
}

🆔 POST /user/delete

💡 로그인되어 있는 유저 탈퇴 API

2. 메인화면 정보

GET /mainpage/data

response

{
	newsList:[
		{
			newsId:0,
			newsType:"소식", // news_type 에 대한 도메인 논의가 아직 안되어 있음
			title:"HeXA에서 첫 세미나 개설!",
			date:"2022.01.04",
		},
	],
}

3. 프로젝트

GET /project/query?searchText={searchText}&status={status}&sort={sort}&includeTechStack={includeTechStack}&excludeTechStack={excludeTechStack}&year={year}&pageNum={pageNum}&page={page}

💡 프로젝트 리스트를 조회하는 API. response에는 content가 포함되지 않는다.

query parameter

{
	searchText:"", // 검색어가 없으면 빈 텍스트

	status:["working","end"],

	sort:"asc", // "asc" | "desc" 최신순 기준 오름차순, 내림차순
	
	sortRule: "time", // 정렬 기준에 대한 기획이 아직 이루어지지 않았습니다.

	includeTechStack:["java","react"],

	excludeTechStack:["flutter"], // 검색 제외할 techStack들을 ,로 구분

	year:2022,

	pageNum:10, // 한 페이지에 불러올 프로젝트 개수

	page:2, // 0부터 시작하는 페이지 index
}

response

{
	projects: [
		{
			projectId:0,
			title:"2023 HEXA WEBPAGE",
			thumbnail:"https://imgurl.com/sdfsdf.png",
			startDate:"2022.01.01",
			endDate:"", // 끝나지 않았으면 빈 텍스트
			techStackList:["java", "spring", "react"],
			memberList:[
				{
					userId:"hexaadmin",
					name:"김선욱",
					profileUrl:"https://imgurl.com/srfsdfsdfs.png",
				},
			],
			status:"working", // 도메인에 대한 논의가 이루어지지 않음
			public:true,
		},
	],
	page:2, // 조회한 page index
	maxPage:3, // 1부터 시작하는 page length
}

GET /project?id={project_id}

💡 project_id에 해당하는 프로젝트의 내용을 불러오는 API 해당 응답에는 content가 포함된다.

query parameter

{
	projectId:0,
}

response

{
	projectId:0,
	title:"2023 HEXA WEBPAGE",
	thumbnailUrl:"https://imgurl.com/sdfsdf.png",
	startDate:"2022.01.01",
	endDate:null, // 끝나지 않았으면 null
	techStackList:["java", "spring", "react"],
	memberList:[
		{
			userId:"hexaadmin",
			name:"김선욱",
			profileUrl:"https://imgurl.com/srfsdfsdfs.png",
		},
	],
	status:"working", // 도메인에 대한 논의가 이루어지지 않음
	public:true,
	content: "#이프로젝트는요, \n##1.동기\n*저는*이랬습니다.", // markdown 텍스트
}

GET /project/techStackList

💡 프론트에서 필터링 목록에 사용될 techStackList를 가져오는 API

response

{
	techStackList:[
		"java", "spring", "react"
	],
}

4. 세미나

GET /seminar/query?searchText={searchText}&year={year}&pageNum={pageNum}&page={page}

💡 세미나 리스트를 조회하는 API.

query parameter

{
	searchText:"", // 검색어가 없으면 빈 텍스트

	year:2022,

	pageNum:10, // 한 페이지에 불러올 세미나 개수

	page:0, // 0부터 시작하는 page index
}

response

{
	seminars:[
		{
			seminarId:0,
			title:"강화학습의 시작과 끝"
			date:"2022.12.08",
			writerUserId: "hexaadmin",
			writerName:"김선욱",
			content:"헥사 전문가와 알아본 강화학습의 뭐시기",
			attachmanent:[
				{
					url:"https://download.com/dsfgsdfg.pdf",
					name:"강의판서.pdf",
					size:"1.2mb",
				}
			],
		}
	],

	page:0, // 조회한 page index
	maxPage:2, // 1부터 시작하는 page length
}
@lafest
Copy link

lafest commented Feb 7, 2023

프로젝트 GET

query parameter

status가 여러 상태를 가질 수 있다면 string array로 구성하는 게 좋을 것 같아요. 나중에 필터를 걸어서 확인하거나 하는 케이스를 생각한다면 array형태로 구성되어 있는 것이 더 유연하게 대응할 수 있을 것으로 보여요. includeTechStack, excludeTechStack도 마찬가지입니다.

response

end_date를 명시적으로 null을 받는 게 어떨까요? (요건 제 개인적 취향..)
status -> 다중 상태를 가진다면 array가 좋을 것 같아요. query parameter쪽에서 달았던 것과 같은 이유입니다.


질문

project API response의 max_page의 역할이 뭔가요?

@gongbj0113
Copy link
Author

gongbj0113 commented Feb 7, 2023

Axios에서 GET param에 Array 넣기

axios.get('/myController/myAction', {
  params: {
    storeIds: [1,2,3]
  },
  paramsSerializer: params => {
    return qs.stringify(params)
  }
})

@gongbj0113
Copy link
Author

gongbj0113 commented Feb 7, 2023

camelcase로 변경함, Project GET에서 리스트를 stringify 한 형태로 query parameter 수정함.

@gongbj0113
Copy link
Author

프로젝트 GET에서, query parameter부분 리스트들로 수정했습니다.
(
이전 : "["java", "react"]"
이후: ["java", "react"]
)

@gongbj0113
Copy link
Author

POST /user/login 의 response에서 expires_in 을 없앴습니다.

@gongbj0113
Copy link
Author

변경된 점

  1. POST /user/create 부분의 parameter이 변경되었습니다.
  2. 중요 이전에는 user_name, name, user_id(number) 이렇게 3 개가 있었는데, user_name이 없어지고 user_id가 이전의 user_name으로 대체되었습니다.
  3. GET /project/techStackList 이 추가되었습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants