Skip to content

Design and Planning

Sanghyun Yi edited this page Nov 26, 2022 · 34 revisions

Document Revision History

Rev. 1.0 2022-10-22 - initial version
Rev. 1.1 2022-11-21 - Modify API Spec (For Successful Quality Pass)
Rev. 1.2 2022-11-26 - Modify Architecture Figure (Redux -> Zustand)

System Architecture

스크린샷 2022-11-26 오후 2 28 40

We use AWS EC2 as a server and AWS S3 for storing documents that are uploaded through our service. Nginx http server is used because it is light and fast web server and can be utilized for reverse proxy. To establish our system safe and easy to scale up, building docker images of frontend & backend would be a good option. We use Guincorn to handle simultaneous backend request instead of uWSGI. We chose Flux for design pattern of frontend, so React and Redux will form Dispatcher-Action-View structure.

Design Details

Frontend Details

View

프레젠테이션2

Components

Component

  • Using Ant-Design, dx-react-scheduler, react-dnd libraries.

Dependencies

Dependency

  • Solid lines for link, navigation, relationships between components and dotted lines for subcomponent relationships.
  • Component 'Menu' is a subcomponent to the others, so for the convenience, dotted lines are ommited which start from 'Menu' component.

Reducer

  • UserState
    • email, password, phoneNumber, projects: ProjectState[]
  • ProjectState
    • name, subject, users: UserState[]
  • MeetingState
    • project: ProjectState, meetAt, content
  • TaskState
    • name, project: ProjectState, content, assignee: UserState, createdAt, updatedAt, untilAt
  • CommentState
    • user: UserState, task: TaskState, content
  • ReactionState
    • user: UserState, comment: CommentState, emoji
  • DocumentState
    • name, document, createdAt, head: boolean
  • DocumentSpaceState
    • name, project: ProjectState, documents: DocumentState[]
  • TimeTableState
    • user: UserState, schedule
  • NotificationState
    • user: UserState, content, checked: boolean

Action

Slice Action Function
User signUp(email, name, password) sign up a new user
login(email, password) login user
logout() logout user
editUser(userId) edit user information
deleteUser(userId) delete user
Project getProject(userId) get user-involved projects
createProject(project: ProjectState) create new project
editProject(projectId) edit project
deleteProject(projectId) delete project
Meeting getMeeting(projectId) get meetings under a project
createMeeting(meeting: MeetingState) create new meeting
editMeeting(meetingId) edit meeting
deleteMeeting(meetingId) delete meeting
Task getTask(projectId) get tasks under a project
createTask(task: taskState) create new task
editTask(taskId) edit task
deleteTask(taskId) delete task
Comment getComment(taskId) get comments under a task
createComment(comment: CommentState) create new comment
editComment(commentId) edit comment
deleteComment(commentId) delete comment
Reaction getReaction(commentId) get reactions under a comment
createReaction(reaction: ReactionState) create new reaction
editReaction(reactionId) edit reaction
deleteReaction(reactionId) delete reaction
Document getDocument(documentSpaceId) get documents under a document space
createDocument(document) create new document
DocumentSpace getDocumentSpace(projectId) get document spaces under a project
createDocumentSpace(documentSpace) create new document space
editDocumentSpace(documentSpaceId) edit document space
deleteDocumentSpace(documentSpaceId) delete document space

Backend Details

ER Diagram

스크린샷 2022-10-24 오후 1 32 01

ManyToManyField in Django is converted into a NEW entity and two OneToMany relation automatically. Therefore we drew additional entities and relations to get clarity. For scalability, User entity has simple attributes but entities about user profile are connected to User. Although we didn't mark created time on every entity, it will be included because it can be useful to manage database.

API Spec

Model API GET POST PUT DELETE
User /api/user/signup/ X Create new user X X
/api/user/signin/ X Log in X X
/api/user/signout/ Log out X X X
/api/user/change/ X X Change user settings Delete user
/api/user/info/:user_id/ Get user info (profile) X X X
Timetable /api/user/timetable/:user_id/ Get timetable of the user X X X
/api/user/timetable/:user_id/m/ X Create timetable Change timetable X
Notification /api/user/noti/:user_id/ Get all notifications of the user X X X
/api/user/noti/:user_id/m/ X Add notification to the user X X
/api/user/noti/detail/:noti_id/ Get notification detail X X X
/api/user/noti/detail/:noti_id/m/ X X Change status of the notification Delete the notification
Image /api/user/image/:user_id/ Get image of user X X X
/api/user/image/:user_id/m/ X Set user image Change user image Delete user image
Project /api/project/:user_id/ Get project list of the user X X X
/api/project/:user_id/m/ X Create new project X X
/api/project/detail/:project_id/ Get project detail X X X
/api/project/detail/:project_id/m/ X X Change project detail Delete project
/api/project/member/ Get all members of the project X X X
/api/project/member/m/ X X Add or Subtract member X
Meeting /api/meeting/:project_id/ Get meeting list of the project X X X
/api/meeting/:project_id/m/ X Create new meeting X X
/api/meeting/detail/:meeting_id/ Get meeting detail X X X
/api/meeting/detail/:meeting_id/m/ X X Change meeting detail Delete meeting
Task /api/task/:project_id/ Get task list of project X X X
/api/task/:project_id/m/ X Create new task X X
/api/task/detail/:task_id/ Get task detail X X X
/api/task/detail/:task_id/m/ X X Change task detail (like Assignee) Delete task
/api/task/belong/:user_id/ Get task list of user X X X
/api/task/document/:task_id/ Get document space list of the task X X X
/api/task/document/:task_id/m/ X Connect document space and task X Disconnect document space and task
DocumentSpace /api/document/:project_id/ Get document space list of project X X X
/api/document/:project_id/m/ X Create new document space X X
/api/document/detail/:docuspace_id/ Get document space detail X X X
/api/document/detail/:docuspace_id/m/ X X Change document space detail Delete document space
Document /api/documents/:docuspace_id/ Get document list of the document space X X X
/api/documents/:docuspace_id/m/ X Add new document to the space X X
/api/documents/detail/:document_id/ Get document detail X X X
/api/documents/detail/:document_id/m/ X X Change document detail (like HEAD) Delete document
Comment /api/comment/:task_id/ Get comment list of the task X X X
/api/comment/:task_id/m/ X Create new comment to the task X X
/api/comment/detail/:comment_id/ Get comment detail X X X
/api/comment/detail/:comment_id/m/ X X Change comment content Delete comment
Reaction /api/reaction/:comment_id/ Get reaction list of the comment X X X
/api/reaction/:comment_id/m/ X Create new reaction to the comment X X
/api/reaction/detail/:reaction_id/ Get reaction detail X X X
/api/reaction/detail/:reaction_id/m/ X X Change reaction Delete reaction

Implementation Plan

Page Tasks Priority Time Sprint Assignee Finished
Log In User login & redirect to main page low 1day
Log Out User logout low 1day 5
Sign Up Create new user medium 1day 5
My Page Show user's profile medium 2day
Profile edit page Let user edit his or her profile medium 2day
Let user update their timetable medium 2day
Main Page List up all the projects belog to the user high 1day 3 김상훈
최석우
List up all the notifications medium 1day 4
ComposeProject Page Create new project very high 2day 3 최석우
김상훈
Send Email to the team members medium 1day 4
Project Main Page Show project information and task list high 1day 3 김상훈
최석우
Show Contribution Summary as a graph high 2day 4
Project Management Page Let user edit the project info medium 1day
Project Calendar Show the task deadline and team meeting schedule medium 1day 4 최석우
김상훈
Create Project Meeting Create new team meeting medium 1day 4
Create Task Create new task very high 2day 3 주형진
이상현
Create new document very high 2day 3 이상현
주형진
Document List List up all the documents medium 1day
Document detail List up all the version changes of the document medium 1day
Task View and Edit Show task information very high 2day 3 주형진
이상현
Upload document high 2day 3 이상현
주형진
Let user leave the comment medium 1day 4

Testing Plan

Unit testing

  • Frontend : Jest & Enzyme
  • Backend : Default Python Unit Test
  • We aim for code coverage to be >80%.
  • Every components should be tested.
  • Every components will be tested just after it is created.

Functional Testing

  • Frontend : Jest & Enzyme
  • Backend : Default Python Unit Test
  • We aim for code coverage to be >80%.
  • If needed, we will mock data to emulate database(MySQL) behavior.

Acceptance & Integration Testing

  • We will use Travis CI for integration testing.