본문으로 이동
주 메뉴
주 메뉴
사이드바로 이동
숨기기
둘러보기
대문
최근 바뀜
게임 목록
임의의 게임으로
커뮤니티
리버티게임 본진
리버티게임(개발)
검색
검색
보이기
계정 만들기
로그인
개인 도구
계정 만들기
로그인
사용자:Senouis/도전과제 서버 명세 문서 원본 보기
사용자 문서
토론
한국어
읽기
원본 보기
역사 보기
도구
도구
사이드바로 이동
숨기기
동작
읽기
원본 보기
역사 보기
새로 고침
일반
여기를 가리키는 문서
가리키는 글의 최근 바뀜
사용자 기여
기록 목록
사용자 그룹을 보기
특수 문서 목록
문서 정보
축약된 URL 얻기
보이기
사이드바로 이동
숨기기
←
사용자:Senouis/도전과제 서버 명세
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
'미디어위키:Gadget-Achievement.js'를 통해 다음 과정을 수행 모든 결과에는 HTTP 응답 코드와 메세지를 응답 헤더에 포함할 것 ==예상 기술 스택== *백엔드 개발 환경: Java + Spring<ref>Apache Tomcat이 포함됩니다.</ref> 기반 or Javascript + Node.js + Express.js **3월까지 Spring을 제대로 익히지 못하면 Express.js로 개발을 시작합니다. **현재 임시로 만든 임시 리포지토리에는 Node.js 기반으로 환경이 구축되어 있습니다. 아직 작업 시작한 부분이 없어 처음 상태 그대로입니다. *DB: MongoDB로 확정 **도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨 **기존의 JSON 파일 저장 방식 대신 BSON 스키마를 사용해 저장하는 MongoDB 채택 ***Spring을 사용할 경우 Spring Data for MongoDB로 DB를 연결할 예정 ***Express.js를 사용할 경우 Mongoose로 연결 예정 ==기능== ===처음 시작할 때=== *안내문(수집하게 되는 개인정보 등을 공시)과 함께 OAuth 2.0 인증 절차를 수행하는 링크를 추가 **웹 페이지에 진입했을 때 Authorization Token과 Refresh 토큰이 모두 없는 경우 ***[[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Authorization 토큰 발급 요청 ***Authorization 코드 발급 기능을 먼저 구현한 후 PKCE 과정을 추가해 code_challenge 수행 필요 ***Redirect URI는 요청한 페이지로 설정 **웹 페이지에 진입했을 때 Authorization 토큰이 있는 경우 or Refresh 토큰이 있는 경우 ***즉시 [[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Access 토큰 및 Refresh 토큰 발급 요청 ***쿠키에 Access 토큰 및 Refresh 토큰을 1주 유효기간으로 설정 * 아래 CRUD 요청에서 Access Token 뿐만 아니라 Refresh 토큰까지 만료된 경우 mw.notification으로 재연동을 요청할 것 {{#mermaid: sequenceDiagram User->>OAuth Server: Request Authorization code OAuth Server-->>User: Give Authorization code User->>OAuth Server: Request Access token(AT) and refresh token(RT) OAuth Server-->>User: Give AT and RT User-->>Achievement Server: Request document creation with AT Achievement Server-)OAuth Server: Request Profile with AT OAuth Server-->>Achievement Server: Give User Profile if it is right Achievement Server-)MongoDB: Create database Achievement Server-)User: Response Success }} ===Create=== libertyga.me/achievement/v0/initialization *스키마 초기화 과정 **웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행 ***요청 종류는 PUT으로 설정 ***PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마를 생성 ****스키마 내부에는 항목 이름을 문자와 숫자로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음 ****타입의 경우 integer로 강제해야 함 **성공/실패할 경우 [https://doc.wikimedia.org/mediawiki-core/REL1_39/js/#!/api/mw.notification mw.notification.notify()]로 알려야 함 libertyga.me/achievement/v0/addition/{user}/{itemname} * 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행 ** 다음과 같은 상황에서 스키마에 항목을 추가 *** 특정 classname을 가진 링크를 클릭했을 때 *** 특정 classname을 가진 div 태그를 발견했을 때 innerHTML에 있는 데이터를 itemname에 밀어넣음 **요청 종류는 PUT으로 설정 **PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마 내에 항목을 하나 추가 ***스키마 내부에는 항목 이름을 문자와 숫자의 조합으로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음 ***max_value를 설정해야 함: data-value 커스텀 HTML attribute에 기록된 값을 읽어야 함, 기본값은 1로 할 것 ***value는 1로 초기화 **결과 반환은 상황에 따라 다름 ***value == maxvalue == 1이면 즉시 달성으로 결과 반환 ***value < maxvalue면 (1/n)을 붙여 결과 반환 *성공/실패할 경우 [https://doc.wikimedia.org/mediawiki-core/REL1_39/js/#!/api/mw.notification mw.notification.notify()]로 알려야 함 ===Read=== libertyga.me:6400/achievement/v0/item/{user}/{itemname} * 아이템 조회 과정 * 파라미터: user와 itemname은 특수문자 필터링 필요 ** 필터링 통과 실패 -> '제작자가 도전과제 이름을 잘못 지정했습니다.'라는 오류 메세지를 반환하여 mw.notification으로 송출하도록 함 libertyga.me:6400/achievement/v0/allitem/{user} * 브라우저 캐싱 기능 추가할 경우 개발할 것 * 브라우저에 저장된 도전 과제 값을 전부 갱신하기 위해 전부는 요청(자주 사용하지 않는 API) ** IndexedDB ===Update=== libertyga.me/achievement/v0/modification/{user}/{itemname} * POST 요청으로, 헤더에 Access 토큰 부착할 것 * 진행도 향상용 ** 특정 classname을 가진 링크를 클릭했을 때 ** 특정 classname을 가진 div 태그를 발견했을 때 innerHTML에 있는 데이터를 itemname에 밀어넣음 * 스키마에 항목이 있고, 달성하지 않은 경우(value < maxvalue) 값을 +1 * 스키마에 항목이 없는 경우 addition API를 호출 ===Delete=== libertyga.me/achievement/v0/deletion/{user}/{itemname} * 도전과제를 초기화하고 스키마만 남김 * DELETE 요청이므로 헤더에 Access 토큰 부착할 것 == 기타 == * 브라우저 캐싱 기능을 후에 추가할 것 ** HEAD 요청이 추가로 필요하며, 자신의 데이터베이스 스키마의 SHA-256 해시값을 헤더에 포함해 반환할 것 ** 반환한 해시값이 다르면 통짜 조회 <references />
사용자:Senouis/도전과제 서버 명세
문서로 돌아갑니다.