Skip to content

Software Architecture

Layer Diagram

Context delineation provided insight of the system from a black box perspective. In the building block view the internal structure and the components to be developed are now considered.

Diveni is separated in four Docker containers:

The main layers are:

  • Reverse Proxy: nginx based reverse proxy passing requests to frontend and backend
  • Frontend: vue.js based web frontend
  • Backend: Java/Spring Boot based backend
  • Database: MongoDB persistence

These layers are separated to different Docker containers for most flexibility and easy updates.

Component Description

Frontend

frontend
├── docker           // docker related files
├── public           // public folder of web app
├── src              // sources of vue.js project
│   ├── assets       // 
│   ├── components
│   ├── locales
│   ├── model
│   ├── router
│   ├── services
│   ├── views
│   ├── App.vue
│   ├── [...]
│   └── main.ts
│   └── [...]
├── [...]
├── package.json     // npm definition file 
├── [...]
└── vue.config.js    // configuration of vue.js
ComponentDescription
AboutDropdownDropdown with links to front-/backend licenses
CardSetComponentCard set selection in page "PrepareSession"
CopySessionIdPopupLink including a popup with the functionalities: copy code or link to clipboard
EstimateTimerDisplays the timer and has the logic for the countdown
DownloadPWAModalModal to ask mobile users to download the app
JiraComponentComponent for the "Planning with Jira" tab.
JoinPageCardCard for joining a Session in page "JoinPage"
LandingPageCardCards for "New Session"/"Join Session"/"Reconnect to Session" in page "LandingPage"
LocaleDropdownDropdown for language selection
MemberVoteCardThe cards which the member can choose from. Used in page "MemberVotePage"
NotifyHostComponentTriggers toast notifications for host. Does not have ui
NotifyMemberComponentTriggers toast notifications for members. Does not have ui
ProjectSelectionComponentDropdown to select project after jira authentication in page "PrepareSession"
RoundedAvatarCircle with animal emoji and name. Used in pages: "JoinPage"/"MemberVotePage"/"SessionPage"
SessionMemberCardThe cards representing the members with name, emoji and current estimation. Used in page "SessionPage"
SessionMemberCircleThe circle representing the members with name and emoji. Used in pages: "SessionPage"/"MemberVotePage"
SignInWithJiraCloudButtonComponentButton which redirects to jira (cloud) authentication
SignInWithJiraServerButtonComponentButton including the login logic for jira server
SignInWithAzureDevOpsButtonComponentButton including the login logic for Azure DevOps
SignInWithGithubButtonComponentButton including the login logic for Github
SignInWithGitlabButtonComponentButton including the login logic for Gitlab
StoryPointsComponentIncludes text for "Planning without user stories"-Tab in page "PrepareSession"
UserStoriesList of all user stories including the logic to select the current user story and the logic for submitting a value
UserStoryComponentIncludes text for "Planning with user stories"-Tab in page "PrepareSession"
UserStoryDescriptionsDisplays the description for the selected user story
UserStorySumCalculates and displays dynamically the sum of all estimated user stories
-----------
JoinCommandModel for the command to join a session
MemberModel representing a member
SessionModel for a session including all relevant information
SessionConfigModel which is used in the session model. Clusters all important information about the configs of the session
UserStoryModel representing a user story
-----------
JiraCallbackPagePage for he jira callback when authenticating. Redirects immediately to the "PrepareSession" Page
JoinPagePage for members to join a session
LandingPageFirst page where a first time user normally lands. Includes the option a user has and redirects either to page "PrepareSession"/"JoinPage" or directly to "SessionPage"
MemberVotePageThe page for members when they join a session. It also includes the voting and selection which the Cards
PrepareSessionPageThe prepare Session Page displays a site where a admin can choose all important configs for the new session: user story mode, card set, timer or password
ResultPageThe ResultPage is displayed after a planning session is finished. It shows the results and the estimation overview over all user stories. Also includes a CSV-Export and a Link back to "LandingPage"
SessionPageThe SessionPage is displayed the admin before and during the planning sessions. It provides some functionality to control the planning like restart session, show estimations or end sessions. Also includes the possibility to add or change the user stories
-----------
RouterThe Router includes all routes to the Pages with their specific links
-----------
StoreThe store includes data which can be accessed from all views and components

Backend

backend
├── src                  // sources of spring boot project
│   ├── main
│   │   ├── java
│   │   └── resources
│   └── test
│       └── java
├── [...]
└── pom.xml
ComponentDescription
WebSocketConfigConfigurations (e.g. prefixes, CORS) for Websockets
-----------
ConfigControllerREST Controller for project configuration
ControllerUtilsHelper functions for all controllers
ErrorMessagesAll error messages which can be thrown in exceptions
ProjectManagementControllerREST Controller for project management software (e.g. Jira)
RoutesControllerREST Controller
WebsocketControllerWebSocket Controller
-----------
PrincipalWebSocketHandlerSet anonymous user (Principal) in WebSocket messages by using uri query UUIDs. This is necessary to avoid broadcasting messages but sending them to specific user sessions
SessionDisconnectedListenerListener when a user disconnects from a session
-----------
AuthorizationCodeAuthorization code for OAuth1
AvatarAnimalEnum for the avatar animals
JiraRequestTokenRequest token for Jira Server
JoinInfoDTO to join a session
MemberMember model
MemberUpdateModel for the current members and highlighted members
ProjectProject for project management providers
SessionSession model
SessionConfigConfiguration for session (e.g. set, timer)
SessionStateEnum for the current state of the session
TokenIdentifierIdentifier for project management providers access token before a session was created
UserStoryUser Story model
VerificationCodeVerification code for OAuth
------
MemberPayloadNotification about a member
NotificationGeneric notification
NotificationPayloadAbstract class for notification payloads
NotificationTypeNotification types (e.g. Admin left, member left, member joined)
-----------
AdminPrincipalPrincipal for admin
MemberPrincipalPrincipal for member
SessionPrincipalsPrincipal for session
-----------
SessionRepositoryRepository to save session data in the database
-----------
SessionScheduledTasksScheduled tasks which will be called in regular intervals (e.g. delete old sessions)
-----------
DatabaseServiceService to call the session repository
WebSockerServiceBusiness logic for the WebSocket controller
------
ProjectManagementProviderInterface for all project management providers with functions which are necessary (e.g. getIssues)
ProjectManagementProviderOAuth1Interface for all project management providers with OAuth1
ProjectManagementProviderOAuth2Interface for all project management providers with OAuth2
------
JiraCloudServiceImplementation for Jira Cloud
-------------------------------
JiraServerServiceImplementation for Jira Server
JiraOAuthClientHelper class for Jira Server OAuth1
JiraOAuthGetAccessTokenHelper class for Jira Server OAuth1
JiraOAuthGetTemporaryTokenHelper class for Jira Server OAuth1
JiraOAuthTokenFactoryHelper class for Jira Server OAuth1
-----------

API

REST API

The current documentation for the REST API can be found as Swagger doc: https://diveni.io/api/swagger-ui/index.html. Or on local development environment at http://localhost:8081/swagger-ui/index.html.

Websocket

This sequence diagram shows all Websocket commands and when they are used.

Diagrams created using Mermaid.

Create Session and Vote

Admin disconnected

Unregister User from Session

Close Session

Made by Diveni Development Team with ❤️ at Lake Constance