From d1d01d59209cf5784e74e8fe1e0a93b10740911f Mon Sep 17 00:00:00 2001 From: lee Date: Wed, 22 Jul 2020 12:32:34 +0100 Subject: [PATCH 1/8] social network project --- subjects/social-network/README.md | 196 ++++++++++++++++++++++++ subjects/social-network/audit/README.md | 0 2 files changed, 196 insertions(+) create mode 100644 subjects/social-network/README.md create mode 100644 subjects/social-network/audit/README.md diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md new file mode 100644 index 000000000..6c14071ae --- /dev/null +++ b/subjects/social-network/README.md @@ -0,0 +1,196 @@ +## Social Network + +### Objectives + +You will have to create a social network that presents both backend and frontend. + + +### Instructions + +### Frontend + +Frontend development is the art of creating sites and web applications that render on the "client-side". It includes everything that users experience directly: text colors and styles, images, graphs and tables, buttons, colors, and navigation menu. It focus on making request to the backend in order to get specific chunks of data to be used or send data to be stored on the backend. + +HTML, CSS, and Javascript are the languages used for frontend development. Responsiveness and performance are two main objectives of the frontend. It can be used frontend frameworks to simplify a developers work. + +#### Framework + +You will have to use a JS framework. It is up to you to choose which one you are going to use. + +Frameworks will help you to organize and implement the features you want on your project, so that you can get more work done in a easier and faster way. + +Some of the most known JS frameworks around are: + +- [React](https://reactjs.org/) +- [Angular](https://angular.io/) +- [Vue.js](https://vuejs.org/) +- [Ember.js](https://emberjs.com) +- [Meteor](https://www.meteor.com/) + +Caution: Note that JS frameworks are different from JS libraries. JS libraries contain code snippets that are used to perform common JavaScript functions, while frameworks will help you by laying out the groundwork/building the bases for your JS project. + +---- + +### Backend + +The back-end is all of the technology required to process the incoming request and generate and send the response to the client. +This is typically divided into three major parts: + +- **Server**, this is the computer that receives request. Though there are machines made and optimized for this particular purpose, you will use your own computer. + +- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middlewares is any code that executes between the server receiving a request and sending a response. These middleware functions might modify the request object, query the database, or otherwise process the incoming request. Middleware functions typically end by passing control to the next middleware function, rather than by sending a response. + +- **Database**, are used as you already now, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. + +#### Sqlite + +In order to store the data in your social network, you will use the database library SQLite. +To structure your database and to achieve better performance we highly advise you to take a look at the [entity relationship diagram](https://www.smartdraw.com/entity-relationship-diagram/) and build one based on your own database. + +To know more about SQLite you can check the [SQLite page](https://www.sqlite.org/index.html). + +#### Migrate + +You will have to create migrations for this project so every time the application runs it creates the specific tables to make the project work properly + +For this you must focus on a folder structure similar to this one: + +```console +student$ tree . +backend +├── pkg +│   ├── db +│   │ ├── migrations +│   │ │   └── sqlite +│   │ │   ├── 000001_create_users_table.down.sql +│   │ │   ├── 000001_create_users_table.up.sql +│   │ │   ├── 000002_create_posts_table.down.sql +│   │ │   └── 000002_create_posts_table.up.sql +│   │ └── sqlite +│   | └── sqlite.go +|   | +|   └── ...other_pkgs.go +| +└── server.go +``` + +The folder structure is organized in a way that helps you to **understand** and **use** migrations, where you can apply it using a simple path, for example: `file://backend/pkg/db/migrations/sqlite`. It can be organized as you wish but **do not forget that the application of migrations and the file organization will be tested**. + +For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suites you project + +All migrations should be stored on a specific folder, like as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. + +---- + +### docker + +You must create two images where one will serve the backend and the other will serve the frontend. + +Both back and front must communicate, for that is the purpose of having them. For this you will have to create a network to make sure that your containers are isolated, you can see more about `docker network` [here](https://docs.docker.com/network/). +This network must have both back and front end where they will communicate between them. + +Only one will be published to a port on the host machine, being the client, so that you can be able to access the port that is exposed. + +---- + +### Authentication + +To be able for the users to use the social network they will have to make an account. So you will have to make a registration and login form. To register, every user should provide at least: + +- Email +- Password +- First Name +- Last Name +- Date of Birth +- Avatar/Image +- Nickname (Optional) +- Relationship Status (Optional) +- About Me (Optional) + +Note that the **Nickname**, **Relationship Status** and **About Me** should be present in the form but the user can skip the filling of those fields. + +When you login you should stay logged in until you choose a log out option that should be available at all times. For this you will have to implement [sessions]() and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). + +---- + +### Followers + +When navigating the social network you should be able to follow and unfollow other users. Needless to say that to unfollow a user you have to be following him/her. + +In order to follow someone the user first needs to send a request to the user he/she wants to follow. Then the other user should be able to accept the request or decline it. If the second user has a public profile (explained in the next topic) this step is skipped and the sending of the request is skipped. + +---- + +### Profile + +Every profile should contain : + +- User information (every information requested in the register form apart from the **Password**, obviously) +- User activity + - Every post made by the user + - Every comment made by the user (and the corresponding post, if the post is from a public profile or followed user) +- Followers and following users (display the users that are following the owner of the profile and who he/she is following) + +There are two types of profiles: a public profile and a private profile. A public profile will display the information specified above to every user on the social network, while the private profile will only display that same information to their followers only. + +When the user is in their own profile it should be available an option that allows the user to turn its profile public or private. + +---- + +### Posts + +After a user is logged in he/she can create posts and comments, on already created posts. While creating a post or a comment, the user can include an image or GIF. + +The user must be able to specify the privacy of the post: + +- public (all users in the social network will be able to see the post) +- private (only followers of the creator of the post will be able to see the post) +- almost private (only selected users by the creator of the post will be able to see the post) + +---- + +### Groups + +A user must be able to create a group. The group should have a title and a description given by the creator and he/she can invite other users to join the group. + +The invited users need to accept the invitation to be part of the group. They can also invite other people once they are already part of the group. Another way to enter the group is to request to be in it and only the creator of the group would be allowed to accept or refuse the request. + +When in a group, a user can create posts and comment the posts already created. These posts and comments will only be displayed to members of the group. + +A user belonging to the group can also create an event, making it available for the other group users. An event should have: + +- Title +- Description +- Day/Time +- 2 Options (at least): + - Going + - Not going + +After creating the event every user can choose one of the options for the event. + +---- + +### Chat + +The user should be able to send private messages to users that he/she is following. It should be able for the users to send images, GIFs and emojis to each other. + +The user that the message was sent to, will receive the message instantly if he/she is following the user that sent the message or if the user has a public profile. + +Groups should have their own chat too, so if a user is a member of the group he/she should be able to send and receive messages to this group chat. + +---- + +### Notifications + +A user must be able to see the notifications in every page of the project and a change on the site should be displayed whenever the user receives a new notification. New notifications are different from new private messages and should be displayed in different ways! + +A user should be notified if: + +- he/she has a private profile and: + - a different user (that does not follow him/her) tries to send him/her a message + - some other user sends him/her a following request +- he/she receives a group invitation, so he can refuse or accept the request +- he/she is the creator of a group and another user requests to join the group, so he can refuse or accept the request +- he/she is member of a group and an event is created + +Every other notification created by you that isn't on the list is welcomed too. diff --git a/subjects/social-network/audit/README.md b/subjects/social-network/audit/README.md new file mode 100644 index 000000000..e69de29bb From ea9985b3a7775141407d235f52283fde615eccf5 Mon Sep 17 00:00:00 2001 From: lee Date: Wed, 22 Jul 2020 17:04:44 +0100 Subject: [PATCH 2/8] review : correction and debating --- subjects/social-network/README.md | 54 +++++++++++++++++-------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index 6c14071ae..b16a79c04 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -2,8 +2,14 @@ ### Objectives -You will have to create a social network that presents both backend and frontend. +You will have to create a Facebook-like social network that will contain: +- Followers +- Profile +- Posts +- Groups +- Notification +- Chats ### Instructions @@ -33,14 +39,14 @@ Caution: Note that JS frameworks are different from JS libraries. JS libraries c ### Backend -The back-end is all of the technology required to process the incoming request and generate and send the response to the client. +The back-end is all of the technology required to process the incoming request, generate and send the response to the client. This is typically divided into three major parts: - **Server**, this is the computer that receives request. Though there are machines made and optimized for this particular purpose, you will use your own computer. -- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middlewares is any code that executes between the server receiving a request and sending a response. These middleware functions might modify the request object, query the database, or otherwise process the incoming request. Middleware functions typically end by passing control to the next middleware function, rather than by sending a response. +- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middlewares is any code that executes between the server receiving a request and sending a response. -- **Database**, are used as you already now, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. +- **Database**, are used as you already know, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. #### Sqlite @@ -76,9 +82,9 @@ backend The folder structure is organized in a way that helps you to **understand** and **use** migrations, where you can apply it using a simple path, for example: `file://backend/pkg/db/migrations/sqlite`. It can be organized as you wish but **do not forget that the application of migrations and the file organization will be tested**. -For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suites you project +For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suits your project -All migrations should be stored on a specific folder, like as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. +All migrations should be stored on a specific folder, as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. ---- @@ -102,14 +108,15 @@ To be able for the users to use the social network they will have to make an acc - First Name - Last Name - Date of Birth -- Avatar/Image +- Avatar/Image (Optional) - Nickname (Optional) -- Relationship Status (Optional) - About Me (Optional) -Note that the **Nickname**, **Relationship Status** and **About Me** should be present in the form but the user can skip the filling of those fields. +Note that the **Avatar/Image**, **Nickname** and **About Me** should be present in the form but the user can skip the filling of those fields. -When you login you should stay logged in until you choose a log out option that should be available at all times. For this you will have to implement [sessions]() and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). +When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions]() and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). + +You can implement your own package for sessions and cookies or you can take a look at some packages to help you. ---- @@ -117,7 +124,7 @@ When you login you should stay logged in until you choose a log out option that When navigating the social network you should be able to follow and unfollow other users. Needless to say that to unfollow a user you have to be following him/her. -In order to follow someone the user first needs to send a request to the user he/she wants to follow. Then the other user should be able to accept the request or decline it. If the second user has a public profile (explained in the next topic) this step is skipped and the sending of the request is skipped. +In order to follow someone the user first needs to send a request to the user he/she wants to follow. Then the other user should be able to accept the request or decline it. If the second user has a public profile (explained in the next topic) this step is skipped and the sending of the request is ignored. ---- @@ -128,7 +135,6 @@ Every profile should contain : - User information (every information requested in the register form apart from the **Password**, obviously) - User activity - Every post made by the user - - Every comment made by the user (and the corresponding post, if the post is from a public profile or followed user) - Followers and following users (display the users that are following the owner of the profile and who he/she is following) There are two types of profiles: a public profile and a private profile. A public profile will display the information specified above to every user on the social network, while the private profile will only display that same information to their followers only. @@ -145,7 +151,7 @@ The user must be able to specify the privacy of the post: - public (all users in the social network will be able to see the post) - private (only followers of the creator of the post will be able to see the post) -- almost private (only selected users by the creator of the post will be able to see the post) +- almost private (only the followers chosen by the creator of the post will be able to see it) ---- @@ -155,6 +161,8 @@ A user must be able to create a group. The group should have a title and a descr The invited users need to accept the invitation to be part of the group. They can also invite other people once they are already part of the group. Another way to enter the group is to request to be in it and only the creator of the group would be allowed to accept or refuse the request. +To make a request to enter a group the user must find it first. This will be possible by having a section where you can browse through all groups. + When in a group, a user can create posts and comment the posts already created. These posts and comments will only be displayed to members of the group. A user belonging to the group can also create an event, making it available for the other group users. An event should have: @@ -172,25 +180,23 @@ After creating the event every user can choose one of the options for the event. ### Chat -The user should be able to send private messages to users that he/she is following. It should be able for the users to send images, GIFs and emojis to each other. +The user should be able to send private messages to users that he/she is following. It should be able for the users to send emojis to each other. -The user that the message was sent to, will receive the message instantly if he/she is following the user that sent the message or if the user has a public profile. +The user that the message was sent to, will receive the message instantly, by the usage of Websockets. If he/she is following the user that sent the message or if the user has a public profile. -Groups should have their own chat too, so if a user is a member of the group he/she should be able to send and receive messages to this group chat. +Groups should have a common chat room, so if a user is a member of the group he/she should be able to send and receive messages to this group chat. ---- ### Notifications -A user must be able to see the notifications in every page of the project and a change on the site should be displayed whenever the user receives a new notification. New notifications are different from new private messages and should be displayed in different ways! +A user must be able to see the notifications in every page of the project. -A user should be notified if: +A user should be notified if he/she: -- he/she has a private profile and: - - a different user (that does not follow him/her) tries to send him/her a message - - some other user sends him/her a following request -- he/she receives a group invitation, so he can refuse or accept the request -- he/she is the creator of a group and another user requests to join the group, so he can refuse or accept the request -- he/she is member of a group and an event is created +- has a private profile and some other user sends him/her a following request +- receives a group invitation, so he can refuse or accept the request +- is the creator of a group and another user requests to join the group, so he can refuse or accept the request +- is member of a group and an event is created Every other notification created by you that isn't on the list is welcomed too. From 5711b8ef97a0e8e9fc526646c703e35b430b5bb3 Mon Sep 17 00:00:00 2001 From: lee Date: Wed, 29 Jul 2020 14:58:04 +0100 Subject: [PATCH 3/8] updating subject --- subjects/social-network/README.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index b16a79c04..a64ffd93a 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -44,10 +44,18 @@ This is typically divided into three major parts: - **Server**, this is the computer that receives request. Though there are machines made and optimized for this particular purpose, you will use your own computer. -- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middlewares is any code that executes between the server receiving a request and sending a response. +- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middleware is any code that executes between the server receiving a request and sending a response. - **Database**, are used as you already know, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. +#### App + +The backend will consist, like said above, of an **app** containing all the backend logic. This logic will there for have several middleware, for example: + +- Authentication, since HTTP is a stateless protocol, we can use several ways to overcome and authenticate a client/user. You can use [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) or [tokens(JWT)](https://jwt.io/) +- Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. +- Websocket, handling the connections in real time, between clients. This will help with the private chats. + #### Sqlite In order to store the data in your social network, you will use the database library SQLite. @@ -114,7 +122,7 @@ To be able for the users to use the social network they will have to make an acc Note that the **Avatar/Image**, **Nickname** and **About Me** should be present in the form but the user can skip the filling of those fields. -When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions]() and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). +When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). You can implement your own package for sessions and cookies or you can take a look at some packages to help you. @@ -200,3 +208,19 @@ A user should be notified if he/she: - is member of a group and an event is created Every other notification created by you that isn't on the list is welcomed too. + +This project will help you learn about: + +- Client utilities +- Authentication : + - Sessions and cookies + - Token(JWT) +- Using and [setting up Docker](https://docs.docker.com/get-started/) + - Containerizing an application + - Compatibility/Dependency + - Creating images +- SQL language + - Manipulation of databases + - Migrations +- The basics of encryption +- Websocket From 294c166c12b1fba9a7d5d57abc1c2a19d2b144a7 Mon Sep 17 00:00:00 2001 From: lee Date: Fri, 31 Jul 2020 16:04:33 +0100 Subject: [PATCH 4/8] questions: chat, database, authentication, bonus --- subjects/social-network/README.md | 22 ++++--- subjects/social-network/audit/README.md | 86 +++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 10 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index a64ffd93a..63164f701 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -44,7 +44,7 @@ This is typically divided into three major parts: - **Server**, this is the computer that receives request. Though there are machines made and optimized for this particular purpose, you will use your own computer. -- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middleware is any code that executes between the server receiving a request and sending a response. +- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response, usually the response is done in JSON, using REST-based API. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middleware is any code that executes between the server receiving a request and sending a response. - **Database**, are used as you already know, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. @@ -53,8 +53,8 @@ This is typically divided into three major parts: The backend will consist, like said above, of an **app** containing all the backend logic. This logic will there for have several middleware, for example: - Authentication, since HTTP is a stateless protocol, we can use several ways to overcome and authenticate a client/user. You can use [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) or [tokens(JWT)](https://jwt.io/) -- Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. -- Websocket, handling the connections in real time, between clients. This will help with the private chats. +- Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG and GIF types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. Or saving the image in the database, you can see more about images and database [here](https://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay). +- Websocket, handling the connections in real time, between clients. This will help with the private and group chats. #### Sqlite @@ -65,7 +65,7 @@ To know more about SQLite you can check the [SQLite page](https://www.sqlite.org #### Migrate -You will have to create migrations for this project so every time the application runs it creates the specific tables to make the project work properly +You will have to create migrations for this project so every time the application runs it creates the specific tables to make the project work properly. For this you must focus on a folder structure similar to this one: @@ -92,7 +92,9 @@ The folder structure is organized in a way that helps you to **understand** and For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suits your project -All migrations should be stored on a specific folder, as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. +All migrations should be stored on a specific folder, as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. + +This migration system can help you manage your time and testing, by filling you database. ---- @@ -122,9 +124,9 @@ To be able for the users to use the social network they will have to make an acc Note that the **Avatar/Image**, **Nickname** and **About Me** should be present in the form but the user can skip the filling of those fields. -When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). +When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) or [tokens(JWT)](https://jwt.io/). -You can implement your own package for sessions and cookies or you can take a look at some packages to help you. +You can implement your own package for the authentication or you can take a look at some packages to help you. ---- @@ -165,7 +167,7 @@ The user must be able to specify the privacy of the post: ### Groups -A user must be able to create a group. The group should have a title and a description given by the creator and he/she can invite other users to join the group. +A user must be able to create a group. The group should have a title and a description given by the creator and he/she can invite other followers to join the group. The invited users need to accept the invitation to be part of the group. They can also invite other people once they are already part of the group. Another way to enter the group is to request to be in it and only the creator of the group would be allowed to accept or refuse the request. @@ -188,9 +190,9 @@ After creating the event every user can choose one of the options for the event. ### Chat -The user should be able to send private messages to users that he/she is following. It should be able for the users to send emojis to each other. +The user should be able to send private messages to users that he/she is following. It should be able for the users to send emojis to each other too. -The user that the message was sent to, will receive the message instantly, by the usage of Websockets. If he/she is following the user that sent the message or if the user has a public profile. +The user that the message was sent to, will receive the message instantly, by the usage of Websockets. If he/she is following the user that sent the message Groups should have a common chat room, so if a user is a member of the group he/she should be able to send and receive messages to this group chat. diff --git a/subjects/social-network/audit/README.md b/subjects/social-network/audit/README.md index e69de29bb..322db9443 100644 --- a/subjects/social-network/audit/README.md +++ b/subjects/social-network/audit/README.md @@ -0,0 +1,86 @@ +#### Functional + +##### Open the project + +###### Is the file system for the backend well organized? + +##### Open the project + +###### Is the file system for the frontend well organized? + +#### Database + +###### Is Sqlite being used in the project as the DataBase? + +###### Does the app implement a migration system? + +###### Is that migration file system well organized? (like the example from the subject) + +##### Start the social network application, then enter the database using the command `"sqlite3 "`. + +###### Are the migrations being applied by the migration system? + +#### Authentication + +###### Does the app implement sessions or JWT for the authentication of the users? + +###### Are the correct form elements being used in the registration? (Email, Password, First Name, Last Name, Date of Birth, Avatar/Image (Optional), Nickname (Optional), About Me (Optional)) + +##### Try to register a user. + +###### Did the app saved the registered user without error? + +##### Try to login with the user you just registered. + +###### Did the login worked without problem? + +##### Try to login with the user you created, but with a wrong password or email. + +###### Did the app detect if the email or password is wrong? + +##### Try to register the same user you already registered. + +###### Did the app detect if the email/user is already present in the database? + +##### Open two browsers (ex: Chrome and Firefox), login into one and refresh the other browsers. + +###### Can you confirm that the browser non logged remains unregistered? + +##### Using the two browsers, login with different users in each one. Then refresh both the browsers. + +###### Can you confirm that both browsers continue with the right users? + +#### Chat + +##### Try and open two browsers (ex: Chrome and Firefox), login with different users in each one. Then with one of the users try to send a private message to the other user. + +###### Did the other user received the message in realtime? + +##### Using the two browsers with the users start a chat between the two of them. + +###### Did the chat between the users went well? (did not crash the server) + +##### Try and open three browsers (ex: Chrome and Firefox or a private browser), login with different users in each one. Then with one of the users try to send a private message to one of the other users. + +###### Did only the targeted user received the message? + +##### Using the three browsers with the users, enter with each user a common group. Then start sending messages to the common chat room using one of the users. + +###### Did all the users that are common to the group receive the message in realtime? + +##### Using the three browsers with the users, continue chatting between the users in the group. + +###### Did the chat between the users went well? (did not crash the server) + +###### Can you confirm that it is possible to send emojis via chat to other users? + +#### Docker + + + + +#### Bonus + +###### +Can you login using Github or other type of external OAuthenticator (open standard for access delegation)? + +###### +Did student created a migration to fill the database? \ No newline at end of file From fedcd3b7df1ee41fffebaedb48bd4e4d4b85cfec Mon Sep 17 00:00:00 2001 From: OGordoo Date: Fri, 31 Jul 2020 17:34:58 +0100 Subject: [PATCH 5/8] questions: followers, posts, groups, notifications, profile --- subjects/social-network/README.md | 40 +++---- subjects/social-network/audit/README.md | 145 ++++++++++++++++++++++-- 2 files changed, 153 insertions(+), 32 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index 63164f701..3c08a9877 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -35,7 +35,7 @@ Some of the most known JS frameworks around are: Caution: Note that JS frameworks are different from JS libraries. JS libraries contain code snippets that are used to perform common JavaScript functions, while frameworks will help you by laying out the groundwork/building the bases for your JS project. ----- +--- ### Backend @@ -44,7 +44,7 @@ This is typically divided into three major parts: - **Server**, this is the computer that receives request. Though there are machines made and optimized for this particular purpose, you will use your own computer. -- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response, usually the response is done in JSON, using REST-based API. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middleware is any code that executes between the server receiving a request and sending a response. +- **App**, this is the application running on the server that listens for requests, retrieves information from the database and sends a response. The server runs an app that contains all the logic about how to respond to various requests based on the HTTP or other types of protocols. Some of these handlers functions will be middleware. Middleware is any code that executes between the server receiving a request and sending a response. - **Database**, are used as you already know, to organize and persist data. Many requests sent to the server might require a database query. A client might request information that is stored in the database, or a client might submit data with their request to be added to the database. @@ -53,8 +53,8 @@ This is typically divided into three major parts: The backend will consist, like said above, of an **app** containing all the backend logic. This logic will there for have several middleware, for example: - Authentication, since HTTP is a stateless protocol, we can use several ways to overcome and authenticate a client/user. You can use [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) or [tokens(JWT)](https://jwt.io/) -- Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG and GIF types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. Or saving the image in the database, you can see more about images and database [here](https://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay). -- Websocket, handling the connections in real time, between clients. This will help with the private and group chats. +- Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. +- Websocket, handling the connections in real time, between clients. This will help with the private chats. #### Sqlite @@ -90,13 +90,13 @@ backend The folder structure is organized in a way that helps you to **understand** and **use** migrations, where you can apply it using a simple path, for example: `file://backend/pkg/db/migrations/sqlite`. It can be organized as you wish but **do not forget that the application of migrations and the file organization will be tested**. -For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suits your project +For migrations you can use [golang-migrate](https://github.com/golang-migrate/migrate) package or other package that better suits your project. All migrations should be stored on a specific folder, as above. The `sqlite.go` should present the connection to the database, the applying of the migrations and other useful functionalities that you may need to implement. -This migration system can help you manage your time and testing, by filling you database. +This migration system can help you manage your time and testing, by filling your database. ----- +--- ### docker @@ -107,7 +107,7 @@ This network must have both back and front end where they will communicate betwe Only one will be published to a port on the host machine, being the client, so that you can be able to access the port that is exposed. ----- +--- ### Authentication @@ -124,11 +124,11 @@ To be able for the users to use the social network they will have to make an acc Note that the **Avatar/Image**, **Nickname** and **About Me** should be present in the form but the user can skip the filling of those fields. -When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) or [tokens(JWT)](https://jwt.io/). +When you login you should stay logged in until you choose a logout option that should be available at all times. For this you will have to implement [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). -You can implement your own package for the authentication or you can take a look at some packages to help you. +You can implement your own package for sessions and cookies or you can take a look at some packages to help you. ----- +--- ### Followers @@ -136,7 +136,7 @@ When navigating the social network you should be able to follow and unfollow oth In order to follow someone the user first needs to send a request to the user he/she wants to follow. Then the other user should be able to accept the request or decline it. If the second user has a public profile (explained in the next topic) this step is skipped and the sending of the request is ignored. ----- +--- ### Profile @@ -151,7 +151,7 @@ There are two types of profiles: a public profile and a private profile. A publi When the user is in their own profile it should be available an option that allows the user to turn its profile public or private. ----- +--- ### Posts @@ -163,11 +163,11 @@ The user must be able to specify the privacy of the post: - private (only followers of the creator of the post will be able to see the post) - almost private (only the followers chosen by the creator of the post will be able to see it) ----- +--- ### Groups -A user must be able to create a group. The group should have a title and a description given by the creator and he/she can invite other followers to join the group. +A user must be able to create a group. The group should have a title and a description given by the creator and he/she can invite other users to join the group. The invited users need to accept the invitation to be part of the group. They can also invite other people once they are already part of the group. Another way to enter the group is to request to be in it and only the creator of the group would be allowed to accept or refuse the request. @@ -186,21 +186,21 @@ A user belonging to the group can also create an event, making it available for After creating the event every user can choose one of the options for the event. ----- +--- ### Chat -The user should be able to send private messages to users that he/she is following. It should be able for the users to send emojis to each other too. +The user should be able to send private messages to users that he/she is following. It should be able for the users to send emojis to each other. -The user that the message was sent to, will receive the message instantly, by the usage of Websockets. If he/she is following the user that sent the message +The user that the message was sent to, will receive the message instantly, by the usage of Websockets. If he/she is following the user that sent the message or if the user has a public profile. Groups should have a common chat room, so if a user is a member of the group he/she should be able to send and receive messages to this group chat. ----- +--- ### Notifications -A user must be able to see the notifications in every page of the project. +A user must be able to see the notifications in every page of the project. New notifications are different from new private messages and should be displayed in a different way! A user should be notified if he/she: diff --git a/subjects/social-network/audit/README.md b/subjects/social-network/audit/README.md index 322db9443..3fb6ab0e6 100644 --- a/subjects/social-network/audit/README.md +++ b/subjects/social-network/audit/README.md @@ -10,7 +10,7 @@ #### Database -###### Is Sqlite being used in the project as the DataBase? +###### Is Sqlite being used in the project as the database? ###### Does the app implement a migration system? @@ -30,29 +30,127 @@ ###### Did the app saved the registered user without error? -##### Try to login with the user you just registered. +##### Try to log in with the user you just registered. -###### Did the login worked without problem? +###### Did the log in worked without problem? -##### Try to login with the user you created, but with a wrong password or email. +##### Try to log in with the user you created, but with a wrong password or email. -###### Did the app detect if the email or password is wrong? +###### Did the app detect if the email or password was wrong? ##### Try to register the same user you already registered. ###### Did the app detect if the email/user is already present in the database? -##### Open two browsers (ex: Chrome and Firefox), login into one and refresh the other browsers. +##### Open two browsers (ex: Chrome and Firefox), log in into one and refresh the other browsers. ###### Can you confirm that the browser non logged remains unregistered? -##### Using the two browsers, login with different users in each one. Then refresh both the browsers. +##### Using the two browsers, log in with different users in each one. Then refresh both the browsers. ###### Can you confirm that both browsers continue with the right users? +#### Followers + +##### Try to follow a private user. + +###### Are you able to send a following request to the private user? + +##### Try to follow a public user. + +###### Are you able to follow the public user without the need of sending a following request? + +##### Open two browsers(ex: Chrome and Firefox), log in as two different private users and with one of them try to follow the other. + +###### Is the user who received the request able to accept or decline the following request? + +##### After following another user successfully try to unfollow him. + +###### Were you able to do so? + +##### Profile + +##### Try opening your own profile. + +###### Does the profile displays every information requested in the register form, apart from the password? + +##### Try opening your own profile. + +###### Does the profile displays every post created by the user? + +##### Try opening your own profile. + +###### Does the profile displays the users that you follow and the ones who are following you? + +##### Try opening your own profile. + +###### Are you able to change between private profile and public profile? + +##### Open two browsers and log in with different users on them, with one of the users having a private profile and successfully follow that user. + +###### Are you able to see a followed user private profile? + +##### Using the two browsers with the same users, with one of the users having a private profile and be sure not to follow him. + +###### Are you prevented from seeing a non-followed user private profile? + +##### Using the two browsers with the users, with one of the users having a public profile and be sure not to follow him. + +###### Are you able to see a non-followed user public profile? + +##### Using the two browsers with the users, with one of the users having a public profile and successfully follow that user. + +###### Are you able to see a followed user public profile? + +#### Posts + +###### Are you able to create a post and commenting already created posts after legging in? + +##### Try creating a post. + +###### Are you able to include an image (JPG or PNG) or a GIF on it? + +##### Try creating a comment. + +###### Are you able to include an image (JPG or PNG) or a GIF on it? + +##### Try creating a post. + +###### Can you specify the type of privacy of the post (private, public, almost private)? + +###### If you choose the almost private privacy option, can you specify the users that are allowed to see the post? + +##### Groups + +##### Try creating a group. + +###### Were you able to invite one of your followers to join the group? + +##### Open two browsers, log in with different users on each browser, follow each other and with one of the users create a group and invite the other user. + +###### Did the other user received a group invitation that he/she can refuse/accept? + +##### Using the same browsers and the same users, with one of the users create a group and with the other try to make a group entering request. + +###### Did the owner of the group received a request that he/she can refuse/accept? + +###### Can a user make group invitations, after being part of the group (being the user different from the creator of the group)? + +###### Can a user make a group entering request (a request to enter a group)? + +###### After being part of a group, can the user create posts and comment already created posts? + +##### Try to create an event in a group. + +###### Were you asked for a title, a description, a day/time and at least two options (going, not going)? + +##### Using the same browsers and the same users, after both of them becoming part of the same group, create an event with one of them. + +###### Is the other user able to see the event and vote in which option he wants? + #### Chat -##### Try and open two browsers (ex: Chrome and Firefox), login with different users in each one. Then with one of the users try to send a private message to the other user. +##### Try and open two browsers (ex: Chrome and Firefox), log in with different users in each one. Then with one of the users try to send a private message to the other user. ###### Did the other user received the message in realtime? @@ -60,7 +158,7 @@ ###### Did the chat between the users went well? (did not crash the server) -##### Try and open three browsers (ex: Chrome and Firefox or a private browser), login with different users in each one. Then with one of the users try to send a private message to one of the other users. +##### Try and open three browsers (ex: Chrome and Firefox or a private browser), log in with different users in each one. Then with one of the users try to send a private message to one of the other users. ###### Did only the targeted user received the message? @@ -74,13 +172,36 @@ ###### Can you confirm that it is possible to send emojis via chat to other users? -#### Docker +#### Notifications + +###### Can you check the notifications on every page of the project? + +##### Open two browsers, log in as two different private users and with one of them try to follow the other. + +###### Did the other user received a notification regarding the following request? + +##### Open two browsers, log in with different users on each browser, follow each other and with one of the users create a group and invite the other user. +###### Did the invited user received a notification regarding the group invitation request? +##### Open two browsers, log in with different users on each browser, create a group with one of them and with the other send a group entering request. +###### Did the other user received a notification regarding the group entering request? + +##### Open two browsers, log in with different users on each browser, become part of the same group with both users and with one of the users create an event. + +###### Did the other user received a notification regarding the creation of the event? + +#### Docker #### Bonus -###### +Can you login using Github or other type of external OAuthenticator (open standard for access delegation)? +###### +Can you log in using Github or other type of external OAuthenticator (open standard for access delegation)? + +###### +Did the student created a migration to fill the database? + +###### +If you unfollow a user, do you get a confirmation pop-up? + +###### +If you change your profile from public to private (or vice versa), do you get a confirmation pop-up? -###### +Did student created a migration to fill the database? \ No newline at end of file +###### +Is there other notification apart from the ones explicit on the subject? From bd8fa6fc42920d45e87c223a69d3136b7c482a35 Mon Sep 17 00:00:00 2001 From: lee Date: Mon, 3 Aug 2020 11:16:56 +0100 Subject: [PATCH 6/8] docker: corrections --- subjects/social-network/README.md | 7 ++----- subjects/social-network/audit/README.md | 2 -- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index 3c08a9877..24104633d 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -100,12 +100,9 @@ This migration system can help you manage your time and testing, by filling your ### docker -You must create two images where one will serve the backend and the other will serve the frontend. +You must create an image that contains both the backend and frontend. Where both of them will communicate within the container prevenient from the image. -Both back and front must communicate, for that is the purpose of having them. For this you will have to create a network to make sure that your containers are isolated, you can see more about `docker network` [here](https://docs.docker.com/network/). -This network must have both back and front end where they will communicate between them. - -Only one will be published to a port on the host machine, being the client, so that you can be able to access the port that is exposed. +In theory only one process will suffice. So you will have to create a Dockerfile witch will build and run the backend and the frontend, but only one (frontend) will be published to a port on the host machine. --- diff --git a/subjects/social-network/audit/README.md b/subjects/social-network/audit/README.md index 3fb6ab0e6..36f76c2f8 100644 --- a/subjects/social-network/audit/README.md +++ b/subjects/social-network/audit/README.md @@ -192,8 +192,6 @@ ###### Did the other user received a notification regarding the creation of the event? -#### Docker - #### Bonus ###### +Can you log in using Github or other type of external OAuthenticator (open standard for access delegation)? From ea9907b13938765913d1182bc97f3a4a8adfc659 Mon Sep 17 00:00:00 2001 From: lee Date: Mon, 3 Aug 2020 15:33:29 +0100 Subject: [PATCH 7/8] corrections: docker and JWT --- subjects/social-network/README.md | 16 +++++++++------- subjects/social-network/audit/README.md | 10 +++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/subjects/social-network/README.md b/subjects/social-network/README.md index 24104633d..810460e54 100644 --- a/subjects/social-network/README.md +++ b/subjects/social-network/README.md @@ -28,10 +28,9 @@ Frameworks will help you to organize and implement the features you want on your Some of the most known JS frameworks around are: - [React](https://reactjs.org/) -- [Angular](https://angular.io/) - [Vue.js](https://vuejs.org/) -- [Ember.js](https://emberjs.com) -- [Meteor](https://www.meteor.com/) +- [svelte](https://svelte.dev/) +- [Mithril](https://mithril.js.org/) Caution: Note that JS frameworks are different from JS libraries. JS libraries contain code snippets that are used to perform common JavaScript functions, while frameworks will help you by laying out the groundwork/building the bases for your JS project. @@ -52,10 +51,12 @@ This is typically divided into three major parts: The backend will consist, like said above, of an **app** containing all the backend logic. This logic will there for have several middleware, for example: -- Authentication, since HTTP is a stateless protocol, we can use several ways to overcome and authenticate a client/user. You can use [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) or [tokens(JWT)](https://jwt.io/) +- Authentication, since HTTP is a stateless protocol, we can use several ways to overcome and authenticate a client/user. You must use [sessions](https://allaboutcookies.org/cookies/session-cookies-used-for.html) and cookies. - Images handling, supporting various types of extensions. In this project you have to handle at least JPEG, PNG types. You will have to store the images, it can be done by storing the file/path in the database and saving the image in a specific file system. - Websocket, handling the connections in real time, between clients. This will help with the private chats. +For the web server you can take a look at [caddy](https://caddyserver.com/docs/), it can serve your site, services and apps and its written in **go**, or you are free to create your own web server. + #### Sqlite In order to store the data in your social network, you will use the database library SQLite. @@ -100,9 +101,11 @@ This migration system can help you manage your time and testing, by filling your ### docker -You must create an image that contains both the backend and frontend. Where both of them will communicate within the container prevenient from the image. +You must create two images where one will serve the backend and the other will serve the frontend. + +Both back and front must communicate, for that is the purpose of having them. -In theory only one process will suffice. So you will have to create a Dockerfile witch will build and run the backend and the frontend, but only one (frontend) will be published to a port on the host machine. +The communication is done in the browser so you will have to publish the ports for both backend and frontend. --- @@ -213,7 +216,6 @@ This project will help you learn about: - Client utilities - Authentication : - Sessions and cookies - - Token(JWT) - Using and [setting up Docker](https://docs.docker.com/get-started/) - Containerizing an application - Compatibility/Dependency diff --git a/subjects/social-network/audit/README.md b/subjects/social-network/audit/README.md index 36f76c2f8..1886b20c6 100644 --- a/subjects/social-network/audit/README.md +++ b/subjects/social-network/audit/README.md @@ -22,7 +22,7 @@ #### Authentication -###### Does the app implement sessions or JWT for the authentication of the users? +###### Does the app implement sessions for the authentication of the users? ###### Are the correct form elements being used in the registration? (Email, Password, First Name, Last Name, Date of Birth, Avatar/Image (Optional), Nickname (Optional), About Me (Optional)) @@ -192,6 +192,12 @@ ###### Did the other user received a notification regarding the creation of the event? +#### Docker + +##### Try and run the application, then use the docker command `"docker ps -a"` + +###### Can you confirm that there are two containers, one for the backend and the other for the frontend? + #### Bonus ###### +Can you log in using Github or other type of external OAuthenticator (open standard for access delegation)? @@ -203,3 +209,5 @@ ###### +If you change your profile from public to private (or vice versa), do you get a confirmation pop-up? ###### +Is there other notification apart from the ones explicit on the subject? + +###### +Does the project present a script to build the images and containers? (using a script to simplify the build) From 5bd7be36894466a6a93a13c44a0fb2a29b904fab Mon Sep 17 00:00:00 2001 From: lee Date: Wed, 5 Aug 2020 16:35:28 +0100 Subject: [PATCH 8/8] optional: desktop application --- .../cross-platform-appimage/README.md | 62 ++++++++++++++ .../cross-platform-appimage/audit.md | 85 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 subjects/social-network/cross-platform-appimage/README.md create mode 100644 subjects/social-network/cross-platform-appimage/audit.md diff --git a/subjects/social-network/cross-platform-appimage/README.md b/subjects/social-network/cross-platform-appimage/README.md new file mode 100644 index 000000000..bc7bffbb0 --- /dev/null +++ b/subjects/social-network/cross-platform-appimage/README.md @@ -0,0 +1,62 @@ +## App image + +### Objectives + +For this optional, `cross platform app image`, you will have to implement a desktop app using [Electron](https://www.electronjs.org/): + +This desktop app should have as principle objective the creation of a messenger, just like facebook or discord. It should be able to run in multiple platforms : windows, linux and macOS. + +You will have to create: + +- A way to see which users are online (able to talk) +- A way to notify the user whenever he/she receives a message +- A real time communication between the users that are chatting +- A section for emojis, where users can send to each other +- An offline possibility here you can see all messages from all users, but can not send messages to them or receive. You must inform the user that he/she is offline/online +- A search engine to search for a messages + +We encourage you to add any other additional features that you find relevant. + +### Instructions + +You must use a method of authentication for the app. + +To be able for the users to use the app you must create a login form, the user should provide: + +- Email +- Password + +If the user does not present a registration, then the app should redirect to the social network website (mandatory project) so that the user can register himself. + +When the user logs in or registers he should stay logged in until he/she chooses a logout option that should be available at all times. Even when the user exits the app and opens it again it should continue logged in until the [session](https://www.electronjs.org/docs/api/session) expires (the time limit is up to you to decide) or the user decides to logout. + +#### Websocket + +The use of websocket must be present in this project: + +- You must be able to send messages in real time just like the [mandatory project](https://public.01-edu.org/subjects/social-network/), you should be able to send chat messages using the website as an user, to the desktop app as another user. +- To see the status of a user, whenever a user goes online/offline the status must change automatically, in real time. So when a user goes offline all the followers must be able to see that the user went offline and its not available to talk. The same happens when the user goes online, all followers must see that he/she is online. + +--- + +#### Offline + +If the internet connection goes down or the user does not have internet, the app should warn the user that there is no connection by displaying a message to say so. The offline mode allows the user to view all the messages sent, but if the user tries to send a message it should display the same error message as the first one. + +Here's a tip [offline/online](https://www.electronjs.org/docs/tutorial/online-offline-events) + +The code must respect the [**good practices**](https://public.01-edu.org/subjects/good-practices/). + +--- + +#### Search + +The search should be interactive, in other words, the results should be displaying as you write, not needing a button for you to click. + +This project will help you learn about: + +- Data manipulation and local storage +- Authentication +- Desktop Applications: + - [Electron](https://www.electronjs.org/docs) +- Websocket diff --git a/subjects/social-network/cross-platform-appimage/audit.md b/subjects/social-network/cross-platform-appimage/audit.md new file mode 100644 index 000000000..3f62a1307 --- /dev/null +++ b/subjects/social-network/cross-platform-appimage/audit.md @@ -0,0 +1,85 @@ +#### General + +###### Does the app implement sessions for the authentication of the users? + +###### Are the correct form elements being used in the login? (Email, Password) + +###### Can you confirm that it is possible to send emojis to other users using the desktop app? + +#### Functional + +##### Try to register a user. + +###### Did the app redirect the user to the social network site? + +##### Try to log in the desktop app with the user you just registered. + +###### Did the login worked without problem? + +##### Try to log in with the user you created, but with a wrong password or email. + +###### Did the app detect if the email or password was wrong? + +##### Log into the desktop app, then close the app and open it once more. + +###### Did the app log in automatically, without being needed to log in once more? + +##### Log into the desktop app, then logout and close the app, open it once more. + +###### Is the app asking for the user to log in? + +##### Try and open a browser with the social-network website and the desktop app, log in with different users in each one. Then with the browser try to send a private message to the desktop user. + +###### Did the desktop user receive the message in realtime? + +##### Using the same browser and desktop app, try to have a chat between the users. + +###### Did the chat between the users went well? + +##### Using the same browser and desktop app, try to logout the browser user. + +###### Did the user went automatically offline (in real time) on the desktop app? + +##### Using the same browser and desktop app, try to log into the browser as a follower of the desktop user (so that the desktop user can see him/her). + +###### Did the user went automatically online (in real time) on the desktop app? + +##### Try to lose the internet connection while being in the app. + +###### Is there some kind of warning that the user lost internet connection? + +##### Try to send a message to a follower while offline. + +###### Did the app warn that there is no internet connection? + +##### Try to search for something in a chat. + +###### Is the search engine interactive? (as you write the results are displayed) + +##### Try going to the chat conversation between two users, then search for a specific message. + +###### Did it output the expected result? + +##### Try to run a [VM](https://www.virtualbox.org/) (virtual machine) with Windows, then install the social network desktop application. + +###### Did the app installed without any problems? + +##### Using this VM, open the app and and repeat all the previous questions. + +###### Does the app behave like it should? + +##### Try to run a [VM](https://www.virtualbox.org/) (virtual machine) with macOS, then install the social network desktop application. + +###### Did the app installed with out any problems? + +##### Using this VM, open the app and and repeat all the previous questions. + +###### Does the app behave like it should? + +#### Bonus + +###### +Does the app have an External Authentication? (Github, Google, etc) + +###### +Does the search engine include operators? (include, exclude or fuzzy) + +###### +Does the search engine include operators for numbers? (equal, not equal, greater than, lesser than)