{"id":13757427,"url":"https://github.com/TeamSparker/Spark-Server","last_synced_at":"2025-05-10T05:32:02.890Z","repository":{"id":38036828,"uuid":"446014383","full_name":"TeamSparker/Spark-Server","owner":"TeamSparker","description":"Spark | 친구와 함께하는 66일간의 습관 형성 서비스 🎇","archived":false,"fork":false,"pushed_at":"2022-11-08T16:57:17.000Z","size":625,"stargazers_count":32,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"release-v1.1.0","last_synced_at":"2024-11-16T13:35:08.505Z","etag":null,"topics":["aws-rds","express","fcm","firebase-functions","githubactions","google-cloud-platform","nodejs","postgresql","server"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TeamSparker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-09T06:43:50.000Z","updated_at":"2024-11-08T04:43:43.000Z","dependencies_parsed_at":"2022-07-12T17:11:44.260Z","dependency_job_id":null,"html_url":"https://github.com/TeamSparker/Spark-Server","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TeamSparker%2FSpark-Server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TeamSparker%2FSpark-Server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TeamSparker%2FSpark-Server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TeamSparker%2FSpark-Server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TeamSparker","download_url":"https://codeload.github.com/TeamSparker/Spark-Server/tar.gz/refs/heads/release-v1.1.0","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253371075,"owners_count":21897998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-rds","express","fcm","firebase-functions","githubactions","google-cloud-platform","nodejs","postgresql","server"],"created_at":"2024-08-03T12:00:37.700Z","updated_at":"2025-05-10T05:32:02.546Z","avatar_url":"https://github.com/TeamSparker.png","language":"JavaScript","readme":"## 🎇 Spark, \u0026nbsp;A large fire comes from small spark\n\n\u003e 👑 WE SOPT 29th APPJAM 대상 👑 \u003cbr\u003e\n\u003e 친구와 함께하는 66일간의 습관 형성 서비스! \u003cbr\u003e\n\u003e 프로젝트 기간 : 2022. 01. 03. ~ 2022. 01. 22. \u003cbr\u003e\n\u003e 📲 [App Store](https://apps.apple.com/kr/app/spark-%EC%8A%A4%ED%8C%8C%ED%81%AC-%EC%B9%9C%EA%B5%AC%EC%99%80-%EC%8A%B5%EA%B4%80-%EA%B4%80%EB%A6%AC/id1605811861) | [Play Store](https://play.google.com/store/apps/details?id=com.teamsparker.android)\n\n## 🔥 Branding\n\n![banner](https://user-images.githubusercontent.com/39653584/150547366-5ff166d7-874d-4b4d-a507-7a387c348991.png)\n\n![영권쌤 거](https://user-images.githubusercontent.com/39653584/150317112-aa048eba-ee94-4711-99dd-89dcb3c2746e.png)\n\n\u003c!-- ---\n\n## 📲 WorkFlow\n\u003cimg src = \"https://user-images.githubusercontent.com/81167570/151120562-3da18d9a-1da0-43ea-92d4-b0576c8472a3.png\" width=\"1000\" /\u003e --\u003e\n\n---\n\n## 📚 API Document\n\n### \u0026nbsp;\u0026nbsp;[Spark API Document ✨](https://www.notion.so/API-94b97e62a8b84769a784d86992287119)\n\n| Function | Description | Developer |\n| :---: | --- | --- |\n| Auth | Apple, Kakao 로그인 | 🦋 영권 |\n|  | Apple, Kakao 회원가입 | 🐱 설희 |\n|  | 회원 탈퇴 | 🐱 설희 |\n| Feed | 피드 모아보기 | 🐱 설희 |\n|  | 피드 좋아요 및 좋아요 취소 | 🐻‍❄️ 정현 / 🦋 영권 |\n|  | 피드 신고하기 | 🐱 설희 |\n| Room | 습관방 생성 | 🦋 영권 |\n|  | 방 리스트 조회 | 🐱 설희 |\n|  | 대기방 상세 조회 | 🦋 영권 |\n|  | 습관방 상세 조회 | 🐱 설희 |\n|  | 나의 목표 설정하기 | 🦋 영권 |\n|  | 습관방 시작 | 🦋 영권 |\n|  | 대기방 인원 조회 | 🦋 영권 |\n|  | 쉴래요, 고민중 | 🦋 영권 |\n|  | 습관 인증하기 | 🐱 설희 |\n|  | 스파크 보내기 | 🐱 설희 |\n|  | 참여 코드로 대기방 조회 | 🦋 영권 |\n|  | 습관방 참여 | 🦋 영권 |\n|  | 참여자 내보내기 | 🦋 영권 |\n|  | 습관방 및 대기방 나가기 | 🦋 영권 |\n|  | 대기방 삭제 | 🦋 영권 |\n|  | 홈에서 성공 및 실패한 카드 | 🐱 설희 |\n| User | 유저 프로필 조회 | 🦋 영권 |\n|  | 유저 프로필 수정 | 🦋 영권 |\n| Myroom | 보관함 리스트 불러오기 | 🐱 설희 |\n|  | 특정 습관방 인증사진 모아보기 | 🐱 설희 |\n|  | 보관함 대표 이미지 변경 | 🐱 설희 |\n|  | 보관함 대표 이미지 목록 불러오기 | 🦋 영권 |\n| Notice | 서비스 알림 조회 | 🦋 영권 |\n|  | 서비스 알림 읽음 처리 | 🦋 영권 |\n|  | 활동 알림 조회 | 🦋 영권 |\n|  | 활동 알림 읽음 처리 | 🦋 영권 |\n|  | 알림 삭제 | 🦋 영권 |\n|  | 새로운 알림 빨콩 조회  | 🦋 영권 |\n| Life Timeline | 생명 타임라인 조회 | 🦋 영권 |\n| FCM | 푸시알림 전송 기능 | 🦋 영권 |\n|  | 푸시알림 ON / OFF Toggle  | 🦋 영권 |\n|  | 푸시알림 설정 조회  | 🦋 영권 |\n| Version | 최신 버전정보 불러오기 | 🦋 영권 |\n|  | 최신 버전정보 갱신하기 | 🦋 영권 |\n\n\n---\n\n\u003c!-- ## 📑 ERD\n\n\u003cimg src=\"https://user-images.githubusercontent.com/39653584/150285337-1c0dbbd0-a8d7-4e79-9528-d0ffb529b04b.png\" width=\"500px\"\u003e\n\n---\n\n## 🧩 Convention\n\u003cdetails\u003e\n\u003csummary\u003eBranch Strategy\u003c/summary\u003e\n\u003cdiv markdown=\"1\"\u003e\n\n```\nmain → develop → feature/#3(issue num)\n    \n1. `feature`에서 각자 기능 작업\n2. 작업 완료 후 `develop`에 PR\n3. 코드 리뷰 후 Confirm 받고 Merge\n4. develop 에 Merge 될 때 마다 **모든 팀원 develop pull** 받아 최신 상태 유지\n```\n\u003c/div\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCommit Convention\u003c/summary\u003e\n\u003cdiv markdown=\"1\"\u003e\n\n| 태그 이름 | 설명 |\n| --- | --- |\n| feat | 새로운 기능을 추가할 경우 |\n| fix | 버그를 고친 경우 |\n| !BREAKING CHANGE | 커다란 API 변경의 경우 |\n| HOTFIX | 급하게 치명적인 버그를 고쳐야 하는 경우 |\n| style | 코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우 |\n| comment | 필요한 주석 추가 및 변경 |\n| docs | 문서를 수정한 경우 (ex. README 수정) |\n| rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업인 경우 |\n| remove | 파일을 삭제하는 작업만 수행한 경우 |\n| chore | 빌드 태스크 업데이트, 패키지 매니저를 설정하는 경우 |\n    \n\u003c/div\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCoding Convention\u003c/summary\u003e\n\u003cdiv markdown=\"1\"\u003e\n\u003cbr\u003e\n    \n1. **변수명**\n    \n- Camel Case 사용 (lower Camel Case)\n- 함수의 경우 동사 + 명사 사용\n- Class, Contructor는 *Pascal Case(=upper 카멜 케이스)*를 사용한다.\n- 글자의 길이는 20자 이내로 제한한다.\n- 4단어 이상이 들어가거나, 부득이하게 20자 이상이 되는 경우 팀원과의 상의를 거친다.\n- Boolean의 경우 조동사+flag 종류로 구성된다. ex) isNum, hasNum\n- 약어는 되도록 사용하지 않는다.\n```jsx\n    let idx; // bad\n    let index; // good\n        \n    let cnt; // bad\n    let count; // good\n        \n    let arr; // bad\n    let array; // good\n        \n    let seoul2Bucheon; // bad\n    let seoulToBucheon; // good\n```\n\n---\n    \n2. **주석 규칙**\n    \n- 한줄은 //로 적고, 그 이상은 /** */로 적는다.\n    \n```jsx\n    // 한줄 주석일 때\n    /**\n     * 여러줄\n     * 주석일 때\n     */\n```\n    \n- 함수에 대한 주석\n    \n```jsx\n    /**\n     *  @챌린지_회고_댓글_등록\n     *  @route POST /:challengeID/comment\n     *  @body parentID, text\n     *  @error\n     *      1. 챌린지 id 잘못됨\n     *      2. 요청 바디 부족\n     *      3. 부모 댓글 id 값이 유효하지 않을 경우\n    */\n```\n\n---\n    \n3. **bracket({}) 규칙**\n    \n- if문의 실행문이 한 줄일 때\n        \n    ```jsx\n        if(trigger) {\n          return;\n        }\n        // logic start\n    ```\n\n---\n    \n4. **괄호 사용**\n    \n- (if, while, for)문 괄호 뒤에 한칸을 띄우고 사용한다.\n        \n    ```jsx\n        if (left == true) {\n        \t// logic\n        }\n    ```\n\n---\n    \n5. **띄어쓰기**\n    \n    ```jsx\n    let a = 5;  (= 양쪽 사이로 띄어쓰기 하기)\n    if (a == 3) {\n    \t// logic\n    }\n    ```\n    \n6. **비동기 함수의 사용**\n\n- Promise함수의 사용은 지양하고 async, await를 사용하도록 한다.\n    \n7. **DataBase Naming**\n    \n- table 명 : 소문자 (ex. user)\n- 필드명 : snake_case (ex. user_id)\n    \n\u003c/div\u003e\n\u003c/details\u003e\n \n---\n    \n### 📁 Foldering\n\n```\n|-📋 .firebaserc\n|-📋 firebase.json\n|-📋 .gitignore\n|-📁 functions_\n               |- 📋 index.js\n               |- 📋 package.json\n               |- 📋 .gitignore\n               |- 📋 .env\n               |- 📁 api_ \n               |         |- 📋 index.js\n               |         |- 📁 routes_\n               |                      |- 📋 index.js\n               |\n               |- 📁 config_ \n               |            |- 📋 dbConfig.js\n               |            |- 📋 firebaseClient.js\n               |\n               |- 📁 constants_\n               |               |- 📋 jwt.js\n               |               |- 📋 responseMessage.js\n               |               |- 📋 statusCode.js\n               |\n               |- 📁 db_ \n               |        |- 📋 db.js\n               |        |- 📋 index.js\n               |\n               |- 📁 lib_\n               |         |- 📋 convertSnakeToCamel.js\n               |         |- 📋 jwtHandler.js\n               |         |- 📋 util.js\n               |\n               |- 📁 middlewares_\n                                 |- 📋 auth.js\n                                 |- 📋 uploadImage.js\n                                 |- 📋 slackAPI.js\n```\n\n---\n\n### 📌 Dependency Modules\n```JSON\n{\n  \"name\": \"functions\",\n  \"description\": \"Spark Server\",\n  \"scripts\": {\n    \"lint\": \"eslint .\",\n    \"serve\": \"cross-env NODE_ENV=development firebase emulators:start --only functions\",\n    \"shell\": \"firebase functions:shell\",\n    \"start\": \"npm run shell\",\n    \"deploy\": \"cross-env NODE_ENV=production firebase deploy --only functions\",\n    \"logs\": \"firebase functions:log\"\n  },\n  \"engines\": {\n    \"node\": \"12\"\n  },\n  \"main\": \"index.js\",\n  \"dependencies\": {\n    \"axios\": \"^0.24.0\",\n    \"busboy\": \"^0.3.1\",\n    \"cookie-parser\": \"^1.4.6\",\n    \"cors\": \"^2.8.5\",\n    \"cross-env\": \"^7.0.3\",\n    \"dayjs\": \"^1.10.7\",\n    \"dotenv\": \"^10.0.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"express\": \"^4.17.2\",\n    \"firebase\": \"^9.5.0\",\n    \"firebase-admin\": \"^9.12.0\",\n    \"firebase-functions\": \"^3.11.0\",\n    \"helmet\": \"^4.6.0\",\n    \"hpp\": \"^0.2.3\",\n    \"jsonwebtoken\": \"^8.5.1\",\n    \"lodash\": \"^4.17.21\",\n    \"multer\": \"^1.4.3\",\n    \"nanoid\": \"^3.1.30\",\n    \"node-schedule\": \"^2.1.0\",\n    \"pg\": \"^8.7.1\"\n  },\n  \"devDependencies\": {\n    \"eslint\": \"^7.6.0\",\n    \"eslint-config-google\": \"^0.14.0\",\n    \"firebase-functions-test\": \"^0.2.0\"\n  },\n  \"private\": true\n}\n```\n --\u003e\n \n\u003cimg src=\"https://user-images.githubusercontent.com/69136340/150557506-ceb378c4-9fcc-4c27-ae98-6b22d61386d9.png\"\u003e\n","funding_links":[],"categories":["Project"],"sub_categories":["Application"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTeamSparker%2FSpark-Server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FTeamSparker%2FSpark-Server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTeamSparker%2FSpark-Server/lists"}