Target Release(s) |
Future |
||||||
JIRAs |
|
||||||
Document Owner |
|||||||
Dates |
|
Review session recording(s):
SportProfiles will be a social networking site for the athletes, sport agents, and sport fanatics all over the world to create their profile that describes and showcase their talents.
After creating an account, the members should be able to setup their profile information which include their sporting skills, educational background, and employment experience. They also, should have the ability to make available pictures and videos from third party web site like Instagram and YouTube as a way to showcase the talent.
There should also be a way for members to connect to one another to communicate. For example, an amateur or professional athlete should be able to reach out to an agent and announce his/her talent and availability. Likewise, an agent should be able to reach out to athletes that they find interesting while they are browsing and searching on the site.
In addition to the web site functionalities mention above, a section on the site should be provided to promote other related content including site guide, sponsorship, and so on.
Although there exist some similar web sites on the internet, but there aren’t any particular one that offers the social networking aspect features that we are looking to do here for this site. And none that could be found that had a mobile application that supported the iPhone and Android phones. This is important, since the expected users are those that are heavily on the mobile phones.
We will need to create a web app with a user interfaces (UI) that supports most modern web browsers (such as safari, edge, google, and Firefox) that are often installed on desktops, laptops, and tablets. In addition, we will need to create a mobile application with a UI that supports the Apple iOS and Android phones.
Requirements |
Fulfilled By |
Known Technology |
Notes |
|
Req. # |
Database Modeling, Design & Implementation |
|||
R1.0 |
Conceptual data model |
Database development team |
||
R1.1 |
Logical data model |
Database development team |
||
R1.2 |
Physical data model |
Database development team |
||
Create the RESTful API (Micro Services) backend |
||||
R2.0 |
Develop the services that will perform the operations and functionalities that is required by the web and mobile applications including retrieving and storing data. |
Backend development team. |
||
Create the web and mobile applications (frontend) |
||||
R3.0 |
Develop the UI for the web application (with support for Chromium based browsers) |
UI development team |
||
R3.1 |
Develop the UI for the mobile application (with support for iOS and Android) |
UI development team |
The solution entails completing the following 3 major parts:
How does these parts all tied up? The figure below demonstrates the interconnection of each part of what makes up the overall system.
7.2.1 Database modeling, design, & Implementation
To design and implement the database, the business analyst team and database designer team must work together to identify from the business requirements the information or data that will need to be collected from the users. The information identified can then be used to do the following data modeling tasks:
7.2.1.1 Conceptual data model
Conceptually, the following Entity Relationship (ER) diagram represents the entities that maps out the kind of data that is expected to support the business requirement for the system.
As you can see from the diagram, each member has a number of different kinds of related information data such as education, employment, contacts, and so on.
7.2.1.2 Logical data model
In this section, we use the diagram above to create a less-abstract logical one. In addition to showing how the entities are related, it also describes the data from a technical perspective. It defines the data structure and provide details on attributes, keys, data types and other characteristics.
Logiccal data model ER diagram (continued)
Logical data model ER diagram (continued)
7.2.1.3 Physical data model
In this section, we are using the logical diagram above to create a new diagram that shows all table structures, including column name, data type, column constraints, primary key, foreign key, and relationships between the tables.
Physical data model ER diagram
Physical data model ER diagram (continued)
Physical data model ER diagram (continued)
7.2.1.4 Relational Database Management System (RDBMS) and hosting considerations
The type of RDBMS to consider may depend on the existing or planned development environment. For example, if you are or planning on developing your backend applications using Java technology, you might consider using a MySQL or an Oracle RDBMS. But, if your current environment or plan on developing backends using .NET technology, then you might consider Microsoft SQL Server. However, with the appropriate database drivers like ODBC and JDBC, you can enable communication between the different RDBMS systems regardless of the development environment.
RDBMS hosting considerations will depend on the type of computing environment such as the cloud versus on-premise. With the on-premise option, you are responsible for not just the RDBMS software (such as MS SQL Server, Oracle, MySQL, etc.) but also the hardware it will be running on. But you will have complete control of operations and maintenance.
With the cloud, you have many hosting options that are based on platform as a service ((PaaS). A couple of them worth considering are:
· Azure SQL Database (based on the latest stable version of Microsoft SQL Server)
· Amazon Relational Database Service (Amazon RDS) – this one allows you to pick from PostgreSQL, MySQL, Oracle, and SQL Server.
PaaS handles most of the database management functions such as upgrading, patching, backups, and monitoring without user involvement.
7.2.2 Develop the backend (business logic) using RESTful API (micro services) technology
Now, that we have defined the required data that is needed for the system, we can define and design the backend with the services and operations that will be used by the (web and mobile) UI applications.
7.2.2.1 – The API services
The API services for this social networking system can be categorized by the following parts:
· Account – this is a list of interfaces containing member account functionalities such as registering and logging users.
· Connection – Contains API functionalities to manage and control in-between member connectivity.
· Member – Contains member management API functionalities.
· Message – Contains interfaces with functionalities for messaging or communication between members.
· Settings - this is a list of interfaces to manage applications settings and user preferences.
· Common – A collection of common interfaces and shared functionalities used by the system.
Account Service
HTTP Method - Request and Response Schemas:
POST: /services/Account/login
Request body (JSON format):
Example Value | Schema:
{
“email”: “string”,
“password”: “string”
}
Response:
Example Value | Schema:
{
"name": "string",
"title": "string",
"email": "string",
"memberID": "string",
"picturePath": "string",
"accessToken": "string",
"expiredDate": "2023-01-22T00:30:53.230Z",
"currentStatus": "string"
}
POST: /services/Account/loginNewRegisteredUser
Request body (JSON format):
Example Value | Schema:
{
“email”: “string”,
“code”: “string”
}
Response:
Example Value | Schema:
{
"name": "string",
"title": "string",
"email": "string",
"memberID": "string",
"picturePath": "string",
"accessToken": "string",
"expiredDate": "2023-01-22T00:30:53.230Z",
"currentStatus": "string"
}
POST: /services/Account/refreshLogin
Request parameter: accessToken (string query),
Response:
Example Value | Schema:
{
"name": "string",
"title": "string",
"email": "string",
"memberID": "string",
"picturePath": "string",
"accessToken": "string",
"expiredDate": "2023-01-22T00:30:53.230Z",
"currentStatus": "string"
}
Connection Service
HTTP Method - Request and Response Schemas:
GET: /services/Connection/getMemberConnections
Request parameter: memberID (integer query)
show (string query)
Response:
Example Value | Schema:
{
"friendName": "string",
"firstName": "string",
"location": "string",
"picturePath": "string",
"connectionID": "string",
"showType": "string",
"status": "string",
"titleDesc": "string",
"params": "string",
"paramsAV": "string",
"email": "string",
"labelText": "string",
"nameAndID": "string"
}
GET: /services/Connection/getMemberConnectionSuggestions
Request parameter: memberID (integer query)
Response:
Example Value | Schema:
{
"friendName": "string",
"firstName": "string",
"location": "string",
"picturePath": "string",
"connectionID": "string",
"showType": "string",
"status": "string",
"titleDesc": "string",
"params": "string",
"paramsAV": "string",
"email": "string",
"labelText": "string",
"nameAndID": "string"
}
PUT: /services/Connection/sendRequestConnection
Request parameter: memberID (integer query)
Response: “success” (string)
GET: /services/Connection/searchMemberConnections
Request parameter: memberID (integer query)
searchText (string query)
Response:
Example Value | Schema:
{
"friendName": "string",
"firstName": "string",
"location": "string",
"picturePath": "string",
"connectionID": "string",
"showType": "string",
"status": "string",
"titleDesc": "string",
"params": "string",
"paramsAV": "string",
"email": "string",
"labelText": "string",
"nameAndID": "string"
}
GET: /services/Connection/GetMemberNetworkInviteConnectionList
GET: /services/Connection/GetRequestsList
GET: /services/Connection/GetMembersBySearchType
GET: /services/Connection/GetSearchConnections
GET: /services/Connection/GetMemberPhoneBook
GET: /services/Connection/GetMemberBrowsedContacts
GET: /services/Connection/SearchMemberByType
PUT: /services/Connection/AcceptRequest
PUT: /services/Connection/RejectRequest
DELETE: /services/Connection/DeleteConnection
GET: /services/Connection/GetEntityBySearchType
GET: /services/Connection/ConnectionSearchResults
GET: /services/Connection/PeopleSearchResults
GET: /services/Connection/NetworkSearchResults
GET: /services/Connection/EventSearchResults
GET: /services/Connection/SearchResults
GET: /services/Connection/SearchAllResults
GET: /services/Connection/GetPeopleIFollow
GET: /services/Connection/GetWhosFollowingMe
POST: /services/Connection/followMember
POST: /services/Connection/UnfollowMember
GET: /services/Connection/IsFollowingConnection
Member Service
HTTP Method - Request and Response Schemas:
GET: /services/Member/ValidateNewRegisteredUser
Request parameter: email (string query)
code (string query)
Response:
Example Value | Schema:
{
"memberId": "string",
"email": "string",
"firstName": "string",
"lastName": "string",
"passWord": "string",
"userImage": "string",
"title": "string"
}
POST: /services/Member/SavePosts
Request parameter: memberID (integer path)
postID (integer path)
postMessage (string query)
Response: “success” (string)
GET:
/services/Member/GetRecentPostResponses
Request parameter: postID (integer path)
Response:
Example Value | Schema
{
"postResponseID": 0,
"postID": 0,
"description": "string",
"dateResponded": "string",
"memberID": 0,
"memberName": "string",
"firstName": "string",
"picturePath": "string"
}
GET: /services/Member/GetRecentPosts/{memberID}
Request parameter: memberID (integer path)
Response:
Example Value | Schema:
{
"postID": "string",
"title": "string",
"description": "string",
"datePosted": "string",
"attachFile": "string",
"memberID": "string",
"picturePath": "string",
"memberName": "string",
"firstName": "string",
"childPostCnt": "string"
}
GET: /services/Member/getRecentNews
GET: /services/Member/GetMemberGeneralInfoV2/{memberID}
GET: /services/Member/GetMemberDates/{memberID}
GET: /services/Member/GetInterestDescription/{interestID}
GET: /services/Member/GetMemberPersonalInfo/{memberID}
GET: /services/Member/GetMemberContactInfo/{memberID}
GET: /services/Member/GetMemberEducationInfo/{memberID}
GET: /services/Member/GetMemberEmploymentInfo/{memberID}
POST: /services/Member/SaveMemberGeneralInfo/{memberID}
POST: /services/Member/SaveMemberPersonalInfo
POST: /services/Member/SaveMemberContactInfo/{memberID}
POST: /services/Member/SaveMemberContactInfoV2/{memberID}
POST: /services/Member/SendFriendRequest/{memberID}
GET: /services/Member/IsContactRequestSent/{memberID}/{toMemberID}
GET: /services/Member/IsMember
GET: /services/Member/IsFriendByEmail/{memberID}
GET: /services/Member/IsFriendByContactID/{memberID}/{contactID}
POST: /services/Member/SaveBasicProfileInfo
GET: /services/Member/GetMemberInfoByEmail}
GET: /services/Member/GetRecentActivities/{memberID}
GET: /services/Member/GetMemberPosts/{memberID}
GET: /services/Member/GetMemberPostResponses/{postID}
POST: /services/Member/CreateMemberPost/{memberID}
GET: /services/Member/CreatePostComment/{memberID}/{postID}
GET: /services/Member/GetMemberWorkExperience/{memberID}
GET: /services/Member/GetMemberInterests
POST: /services/Member/AddMemberSchool/{memberID}
PUT: /services/Member/UpdateMemberSchool/{memberID}
DELETE: /services/Member/RemoveMemberSchool
POST: /services/Member/AddWorkExperience/{memberID}
PUT: /services/Member/UpdateMemberWorkExperience/{memberID}
DELETE: /services/Member/RemoveMemberWorkExperience
GET: /services/Member/IsMemberActive/{memberID}
GET: /services/Member/GetMemberEmail/{memberID}
POST: /services/Member/AddMemberActivity/{memberID}
GET: /services/Member/GetRegisteredMembers/{status}
POST: /services/Member/SendAdvertisementInfo
GET: /services/Member/ResetPassword
GET: /services/Member/GetYoutubeChannel/{memberID}
PUT: /services/Member/SetYoutubeChannel
GET: /services/Member/GetInstagramURL/{memberID}
PUT: /services/Member/SetInstagramURL
GET: /services/Member/IsResetCodeExpired
GET: /services/Member/ChangePassword
POST: /services/Member/UploadProfilePhoto/{memberID}
GET: /services/Member/SetMemberStatus
GET: /services/Member/GetVideoPlayList/{memberId}
GET: /services/Member/GetVideosList/{playerListID}
Message Service
HTTP Method - Request and Response Schemas:
GET:
/services/Message/GetMemberNotifications
Request parameter: memberID (integer path)
showType (string query)
Response:
Example Value | Schema:
{
"notificationId": 0,
"subject": "string",
"notification": "string",
"sentDate": "2023-01-22T05:37:04.593Z",
"status": true
}
GET:
/services/Message/GetMemberMessages
Request parameter: memberID (integer path)
type (string query)
showType (string query)
Response:
Example Value | Schema:
{
"attachement": "string",
"body": "string",
"contactName": "string",
"contactImage": "string",
"senderImage": "string",
"contactID": "string",
"flagLevel": "string",
"importanceLevel": "string",
"messageID": "string",
"messageState": "string",
"senderID": "string",
"subject": "string",
"msgDate": "string",
"fromID": "string",
"firstName": "string",
"fullBody": "string"
}
GET:
/services/Message/GetTotalUnreadMessages
Request parameter: memberID (integer path)
Response:
Example Value | Schema
0 (an integer)
POST: /services/Message/CreateMessage
POST: /services/Message/CreateMessageBySource
PUT: /services/Message/ToggleNotificationState
DELETE: /services/Message/DeleteNotification/{notificationID}/{memberID}
PUT: /services/Message/ToggleMessageState
GET: /services/Message/GetNotificationByID/{nid}
GET: /services/Message/GetMessageInfoByID/{msgID}
DELETE: /services/Message/DeleteMoveMessage/{msgID}
DELETE: /services/Message/DeleteMessage/{msgID}
GET: /services/Message/SearchMessages/{memberID}
DELETE: /services/Message/EmptyMessageFolders/{mID}
Settings Service
HTTP Method - Request and Response Schemas:
POST:
/services/Setting/GetMemberNameInfo
Request parameter: memberID (integer path)
Response:
Example Value | Schema:
{
"firstName": "string",
"lastName": "string",
"middleName": "string",
"email": "string",
"securityQuestion": "string",
"securityAnswer": "string",
"passWord": "string"
}
PUT: /services/Setting/SaveMemberNameInfo
Request parameter: memberID (integer path)
Example Value | Schema:
{
“firstName”: “string”,
“middleName”: “string”,
“lastName”: “string”
}
Response: “success” (string)
PUT:
/services/Setting/SaveMemberEmailInfo
Request parameter: memberID (integer path)
Email (string query)
Response: “success” (string)
PUT: /services/Setting/SavePasswordInfo
PUT: /services/Setting/SaveSecurityQuestionInfo/{memberID}
PUT: /services/Setting/DeactivateAccount/{memberID}
GET: /services/Setting/GetMemberNotifications/{memberID}
PUT: /services/Setting/SaveNotificationSettings/{memberID}
GET: /services/Setting/GetProfileSettings/{memberID}
PUT: /services/Setting/SaveProfileSettings/{memberID}
GET: /services/Setting/GetPrivacySearchSettings/{memberID}
PUT: /services/Setting/SavePrivacySearchSettings/{memberID}
Common Service
HTTP Method - Request and Response Schemas:
GET: /services/Common/EncryptString
Request parameter: stringToEncrypt (string query)
Response: “stringEncrypted” (string)
GET: /services/Common/DecryptString
Request parameter: stringToDecrypt (string query)
Response: “DecryptedString” (string)
GET: /services/Common/GetStates
Request
Response:
Example Value | Schema:
{
“name”: “string”,
“abbreviation”: “string”,
“stateID”: integer
}
PUT: /services/Common/logs
Request parameter: message (string query)
stack (string query)
Response: “success” (string)
GET: /services/Common/GetSportsList
Request:
Response:
Example Value | Schema:
{
“id”: “string”,
“name”: “string”,
“description”: “string”
}
GET: /services/Common/GetSchoolByState
Request parameter: state (string query)
institutionType (string query)
Response:
Example Value | Schema:
{
“schoolID”: “string”,
“schoolName”: “string”,
}
GET: /services/Common/GetAds
Request parameter: type (string query)
Response:
Example Value | Schema:
{
"id": 0,
"name": "string",
"headerText": "string",
"postingDate": "2023-01-22T08:58:35.035Z",
"textField": "string",
"navigateUrl": "string",
"imageUrl": "string",
"type": "string"
}
7.2.2.2 – API Service Security
After a user is authenticated using the HTTP request services/Account/login URI (see account service above), as part of the response, a JWT token string is returned and is stored in the application session temporary storage. This JWT token is used to authorized access to the service operations.
To get a possible successful response from an API service request, you must include the JWT token string as part of the request authorization header prepending the keywork “Bearer”. For an example, using Curl statement:
· curl -H 'Accept: application/json' -H "Authorization: Bearer ${TOKEN}" https://{hostname}/api/myresource
where TOKEN is the variable holding the token string value.
7.2.2.3 – The API services Technology consideration
Application development
RESTful API (micro services) development will depend on your existing or preferred application development environment. Two of the popular cross-platform environments include Microsoft .NET Core and Java.
.NET Core to develop API services offers incredible benefits including cloud-based configurations, rapid development, and cross-platform support. It includes the Entity Framework (EF) Core which is a lightweight, extensible, open source and cross-platform version of the Microsoft’s popular EF data access technology. EF Core basically serve as an object-relational mapper (ORM) which enables .NET developers to work with a database using .NET objects and helps them by eliminating the need for most of the data-access code that typically needs to be written.
The Java world also offers some excellent frameworks for developing microservices. One of the popular considerations is the Spring Boot framework. It gives developers an extremely fast way to build and deploy applications and services. It also offers the popular Hibernate java framework and ORM tool which is used to provide the implementation of the Java Persistence API (JPA) methods. JPA is an abstraction that is used to map the java object with the database making it easy to implement your API to interact with a database.
Hosting and deployment considerations
Beside the development environment to create the API services, it is also worth discussing where the developed API services will be hosted or deployed such as the cloud or on-premise. As mentioned earlier, with on-premise, you will be responsible for configuring and maintaining the servers that the web API will be deployed.
With the cloud, you do have many options even from the different vendors. With Microsoft Azure, you have a couple of options:
· Using infrastructure as a service (IaaS) – obtaining Virtual Machine (VM) – However, you will be responsible for not just the deployment of the app, but also for maintaining the server as you would similar to an on-premise environment.
· Using platform as a server (PaaS) – by creating an Azure Web Apps Service – this offers a hosting service to deploy your web apps including API web services. And you don’t have to worry about the configuration and maintenance of servers.
AWS delivers reliable, scalable computing resources on which to host web apps by allowing you to use a number of AWS components alone or combined. These components include Amazon EC2 for computing, Amazon S3 for storage, Amazon RDS for database.
7.2.3 - Develop the UI for the web and mobile applications
Now, that we have define our HTTP web service API, we can begin discussions on the designing and development of the UIs and functionalities that will consume the them.
The goal here is to create an attractive and aesthetically appealing interface that is accessible and designed for potential members. For an existing development environment, they are most likely to have something in place in terms of how they want their web and mobile applications to look in terms of general theme and so on. But, for new application such as this one it may require extensive research and doing to get this done right. While striving to meet requirement, the five major elements to keep in mind in designing the application for both web and mobile is:
· User interface,
· Usability,
· Content,
· Creativity,
· Accessibility
7.2.3.1 Sketching the Application Components
When sketching the application, the same rule will apply for both the web and mobile application. We are basically interested in the navigation, branding, forms (or pages), buttons, and any other interactive elements. To help with the sketch, we can take a look at the requirements and come up with the major components that define the system:
· Account component – includes login, register, and forgot password screens.
· Home component – includes menu and menu items to allow navigation to other components like Messages, Members, Connections, and Settings.
· Connections component – includes menu items to view list of member’s connections, list of members requesting connection, search for connections, people following list, etc.
· Members component – includes menu items to view and edit member profile related information.
· Messages component – includes screen to allow creating new messages, view of messages inbox, and ability to response and delete messages.
· Settings component – to manage member & site configurations
Account component
Home component
After a successful login, the user is to be taken to the Home page which consist mainly of navigational links that allows the user to use the app’s functionalities and components. The home component is separated into 5 sections (see sketch below):
· The Header - contains menu bar with the menu items – it remains visible throughout the login session. Note, in the header, clicking home can return
· The Footer – contains copyright information – it too remains visible throughout the login session.
· Recent News – a sports related news section of current activities in the sports world. – located on the top left section of the screen under the menu bar.
· Recent Post – a list of most recent member posts – located underneath the Recent News section.
· Site Guide – an area that acts as a site guidance with links that point to help – located on top right corner of screen under the menu bar
· Site Sponsor – an area that can be used to display advertisements from third party site. For example, google ads. – located under the Site Guide section,
Connections component
The connections component is accessible via the connections’ menu item located at the header menu found in the home component. Clicking on the connection link reveals a drop down with menu items:
To do: sketch screen for each menu items for the connection’s component.
Member component
The member component is accessible via the members’ menu item located at the header menu found in the home component. Clicking on the member link reveals the drop down with the menu items:
To do: sketch screen for each menu items for the members component.
Messages component
The messages component is accessible via the messages’ menu item located at the header menu found in the home component. Clicking on the messages link reveals the messages screen with the list of messages along with links to read and response to messages. You also can create new and delete messages.
To do: sketch screen for the message component.
Settings component
The Settings component is accessible via the settings’ menu item located at the header menu found in the home component. Clicking on the settings link reveals the drop down with the menu items:
To do: sketch screen for each menu items for the settings component.
7.2.3.2 Technology consideration
Here we are interested in using a client-side framework for building a rich, interactive, and modern web application. There are three that are worthy of considerations: Angular, React, Blazor. And it is worth mentioning that it may come down to how your development environment is structured. For example, if you are a Microsoft .NET shop, you might consider a framework like Blazor where you can take advantage of utilizing C#. Here is more on the three frameworks:
Angular
Angular is a typescript-based frontend framework rated one of the most popular open-source web frameworks in the world. It helps with the creation of interactive user interfaces, single-page web apps, advanced web apps, and so on. It used Typescript programming language which is a superset of the popular JavaScript. It uses Model-View-Controller which separates program logic from user interface controls. It is suitable for both web and mobile development. The application code consists of different Angular components, each being written in four separate files: Typescript to implement the components, and HTML file to define the view, a CSS file to define the stylistic features, and a special file for testing purposes. Also, angular components are reusable.
React
React is a JavaScript library for UI development. React is based on JavaScript ES6+ combined with JSX script. JSX is an extension for syntax, which makes a JavaScript code resemble that written in HTML. The architecture of React app is component-based. The code is made of React components, which are rendered with React DOM library and directed in two ways: functional (with a function that returns JSX)
Blazor
Blazon is a Microsoft UI framework that follows a unique approach, leveraging C# .NET and WebAssembly to create single page applications that run-in web browsers It essentially allows a developer to build interactive client-side applications with HTML, CSS, and C#.
On the mobile device side, to develop an iOS or android native application, you would need to consider different development tools for each platform. To avoid this, you should consider Microsoft’s .NET Multi-platform App UI (.NET MAUI).
.NET MAUI
Using .NET MAUI, you can develop apps that can run on Android, iOS, macOS, and Windows from a single shared code-base. You can create multi-platform apps using a single project using C# and XAM., but you can add platform-specific source code and resources if necessary. You are sharing UI layout and design across platforms. You are also sharing code, tests, and business logic across platforms.
# |
Responsibility |
Responsibility description |
Effort Score |
1 |
Database development team |
Design and implementation of database |
5 |
2 |
Backend software development team |
Backend (business logic and API services) development |
5 |
3 |
UI software development team |
UI (web and mobile) development |
5 |
Total Effort Assessment: (sum of the column) |
15 |
ID |
Question |
Response |
Owner |
Date |
Approvers |
Date |
Comments |
Marc Manuel |
1/10/2020 |
Played role of Business Analyst, Architect, DB and Software developer and engineer. |