# PA: Product and Presentation
# A9: Product
The main goal of the AskIt project is the development of an information system with a web interface for users to exchange knowledge through questions and answers. AskIt can be used by everyone that would like to engage with others. Every post is reviewed by a group of Moderators that ensures a safer place for everyone. Askiters can interact with each other by answering other people's questions, or by getting together in communities, where they can post about their similar tastes, hobbies, or lives.
**1. Installation**
Source code:
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/tree/release
Docker command for running our application:
```docker run -it -p 8000:80 --name=lbaw22112 -e DB_DATABASE="lbaw22112" -e DB_SCHEMA="lbaw22112" -e DB_USERNAME="lbaw22112" -e DB_PASSWORD="egddzHSL" git.fe.up.pt:5050/lbaw/lbaw22112/lbaw22112 # Replace with your group's image name```
**2. Usage**
URL to the product: http://lbaw22112.lbaw.fe.up.pt
**2.1 Administration Credentials**
| Username | Password |
| -------- | -------- |
| Alberto | a |
**2.2 User Credentials**
| Type | Username | Password |
| -------- | -------- | -------- |
| Basic account | Berto | b |
| Moderator account | Alberto | a |
**3. Application Help**
On the navigation bar, there's two links that direct the user to the FAQ and Contacts pages.
Inside the FAQ page, the user can find help with common problems like who can use Askit. For specific questions, we created the page Contacts that provides information of the creators and offers a direct way to talk to them. Since most features are pretty self-explanatory, we did not deem necessary to create a helping interface for most of them.
**4. Input Validation**
One of the most important validations on our project is the email inputed on the register form. This email has a specific format and it will show a warning if it does not agree to it.

Another client-side validation is present on the password input. It is mandatory that all passwords have at least 6 characters, otherwise a warning message will be shown and the input will not be validated.

Since there's no necessary format for creating a post, we decided that no validation was necessary for this, verifying only that the title of the created post could not be empty, only allowing the creation when there was some sort of character in it.
When it comes to server-side input validation, in the search engine, we take the user's input and check it against the database to verify if the query submitted in fact exists in the server and, if so, return the desired results.

**5. Check Accessibility and Usability**
Check Accessibility
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/blob/desenvolvimento/Validation%20Results/Checklist%20de%20Acessibilidade.pdf
Check Usability
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/blob/desenvolvimento/Validation%20Results/Checklist%20de%20Usabilidade.pdf
**6. HTML & CSS Validation**
HTML results
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/tree/desenvolvimento/Validation%20Results/HTML%20Results
CSS Validation
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/tree/desenvolvimento/Validation%20Results/CSS%20Results
**7. Revisions to the Project**
- Added user stories regarding communities
- Added possibility to search for users
- Switched like system to upvote/downvote system
- Added notification tab for users
- Vote on answers
**8. Web Resources Specification**
https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/blob/main/docs/a9_openapi.yaml
```yaml
openapi: 3.0.0
info:
version: '1.0'
title: 'AskIt Web API'
description: 'Web Resources Specification (A9) for AskIt'
servers:
- url: http://lbaw.fe.up.pt
externalDocs:
description: Find more info here.
url: https://git.fe.up.pt/lbaw/lbaw2223/Lbaw22112/-/wikis/EAP
tags:
- name: 'M01: Authentication and Individual Profile'
- name: 'M02: Posts'
- name: 'M03: Tags'
- name: 'M04: Likes and Follows'
- name: 'M05: User Administration and Static pages'
- name: 'M06: Communities'
paths:
/login:
get:
operationId: R101
summary: 'R101: Login Form'
description: 'Provide login form. Access: PUB'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'200':
description: 'Ok. Show Log-in UI'
post:
operationId: R102
summary: 'R102: Login Action'
description: 'Processes the login form submission. Access: PUB'
tags:
- 'M01: Authentication and Individual Profile'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
email:
type: string
password:
type: string
required:
- email
- password
responses:
'302':
description: 'Redirect after processing the login credentials.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful authentication. Redirect to user profile.'
value: '/profile/{id}'
302Error:
description: 'Failed authentication. Redirect to login form.'
value: '/login'
/logout:
post:
operationId: R103
summary: 'R103: Logout Action'
description: 'Logout the current authenticated user. Access: USR, ADM'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'302':
description: 'Redirect after processing logout.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful logout. Redirect to login form.'
value: '/login'
/register:
get:
operationId: R104
summary: 'R104: Register Form'
description: 'Provide new user registration form. Access: PUB'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'200':
description: 'Ok. Show Sign-Up UI'
post:
operationId: R105
summary: 'R105: Register Action'
description: 'Processes the new user registration form submission. Access: PUB'
tags:
- 'M01: Authentication and Individual Profile'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
name:
type: string
email:
type: string
bio:
type: string
required:
- email
- password
responses:
'302':
description: 'Redirect after processing the new user information.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful authentication. Redirect to user profile.'
value: '/users/{id}'
302Failure:
description: 'Failed authentication. Redirect to login form.'
value: '/login'
/profile/{id}:
get:
operationId: R106
summary: 'R106: View user profile'
description: 'Show the individual user profile. Access: PUB'
tags:
- 'M01: Authentication and Individual Profile'
parameters:
- in: path
name: id
schema:
type: integer
required: true
responses:
'200':
description: 'Ok. Show User Profile UI'
/profile:
get:
operationId: R107
summary: 'R107: View current logged user profile'
description: 'Show the individual user profile. Access: USR'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'200':
description: 'Ok. Show User Profile UI'
/editProfile:
get:
operationId: R108
summary: 'R108: View edit profile page.'
description: 'Show the individual user profile. Access: USR'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'200':
description: 'Ok. Show edit user profile UI'
post:
operationId: R109
summary: 'R109: Edit current logged user profile'
description: 'Edit user profile. Access: OWN, ADM'
tags:
- 'M01: Authentication and Individual Profile'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
name:
type: string
email:
type: string
userType:
type: integer
responses:
'302':
description: 'Redirect after editing the new user profile.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Edit successful. Redirect to user profile.'
value: '/users/{id}'
302Failure:
description: 'Failed to edit profile. Redirect to edit page with the error.'
value: '/users/{id}'
/profileEdited:
get:
operationId: R110
summary: 'R110: Profile successfully edited UI.'
description: 'Profile successfully edited UI page. Access: USR'
tags:
- 'M01: Authentication and Individual Profile'
responses:
'200':
description: 'Ok. Show User Profile UI'
/home:
get:
operationId: R205
summary: 'R205: Home Page showing trending questions.'
description: 'Home page. Access: PUB'
tags:
- 'M02: Posts'
responses:
'200':
description: 'Ok. Show Home Page'
/posts/{id}:
get:
operationId: R206
summary: 'R206: View post details'
description: 'Show the post details page. Access: PUB'
tags:
- 'M02: Posts'
parameters:
- in: path
name: id
schema:
type: integer
required: true
responses:
'200':
description: 'Ok. Show question details page.'
delete:
operationId: R209
summary: 'R209: Delete post given an ID'
description: 'Delete post given an ID. Access: OWN, ADM'
tags:
- 'M02: Posts'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: string
required: true
responses:
'200':
description: Success delete.
/post/edit/{id}:
post:
operationId: R208
summary: 'R208: Edit question'
description: 'Edit question (Edit property - 0/1). Access: OWN, ADM'
tags:
- 'M02: Posts'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: string
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
date:
type: string
score:
type: integer
content:
type : string
edit:
type : integer
required:
- content
- edit
responses:
'302':
description: 'Redirect after processing the post.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful post. Redirect to question edited.'
value: '/users/{id}'
302Error:
description: 'Failed post. Redirect to post creating with errors.'
value: '/postPage'
/post/{type}/{question_id}:
post:
operationId: R211
summary: 'R211: Create question'
description: 'Create question . Access: OWN, ADM'
tags:
- 'M02: Posts'
parameters:
- in: path
name: question_id
description: ID of the post
schema:
type: integer
required: true
- in: path
name: type
description: Type of the question
schema:
type: string
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
date:
type: string
score:
type: integer
content:
type : string
edit:
type : integer
required:
- content
- edit
responses:
'302':
description: 'Redirect after creating the post.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful post. Redirect to question edited.'
value: '/users/{id}'
302Error:
description: 'Failed post. Redirect to post creating with errors.'
value: '/postPage'
/post/update/{type}/{post_id}:
post:
operationId: R212
summary: 'R208: Edit question'
description: 'Edit question (Edit property - 0/1). Access: OWN, ADM'
tags:
- 'M02: Posts'
parameters:
- in: path
name: type
description: Type of the post
schema:
type: string
required: true
- in: path
name: post_id
description: ID of the post
schema:
type: string
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
date:
type: string
score:
type: integer
content:
type : string
edit:
type : integer
required:
- content
- edit
responses:
'302':
description: 'Redirect after processing the post.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful post. Redirect to question edited.'
value: '/users/{id}'
302Error:
description: 'Failed post. Redirect to post creating with errors.'
value: '/postPage'
/score/{post_id}}:
post:
operationId: R401
summary: 'R401: Like/Dislike a post.'
description: 'Like or Dislike a post given an ID. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: post_id
description: ID of the post
schema:
type: string
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
id:
type: integer
eval:
type: integer
required:
- id
- eval
responses:
'302':
description: 'Redirect after evaluation post.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful evaluation. Redirect to post page.'
value: '/question/{id}'
302Error:
description: 'Failed to evaluate. Redirect to post page.'
value: '/question/{id}'
/search:
get:
operationId: R201
summary: 'R202: Search Questions API'
description: 'Searches for questions and returns the results as JSON. Access: PUB.'
tags:
- 'M02: Posts'
parameters:
- in: query
name: query
description: String to use for full-text search
schema:
type: string
required: true
- in: query
name: item
description: Tag of the questions
schema:
type: string
required: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: string
score:
type: integer
content:
type: string
date:
type: string
example:
- id: 1
score: 1
content: Can dogs bounce?
date: "2011-10-12"
- id: 2
score: 5
content: Can chicken bounce?
date: "2015-11-10"
/tags:
get:
operationId: R302
summary : 'R302: Tags page UI.'
description: 'Page showing all available tags .'
tags:
- 'M03: Tags'
responses:
'200' :
description : 'Ok. Show all available tags.'
post:
operationId: R310
summary: 'R10: Create tag.'
description: 'Create a tag to be used later.'
tags:
- 'M03: Tags'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
tag:
type : string
required:
- tag
responses:
'200' :
description : 'Ok. Tag created.'
/tags/{id}:
get:
operationId: R303
summary : 'R303: Get the questions from a certain tag.'
description: "Get the questions from a tag ID."
tags:
- "M03: Tags"
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
tags:
type : array
items :
type : string
id :
type : integer
example:
- id: 1
tags: ["Animals", "Food"]
delete:
operationId: R305
summary: 'R304: Set the tag(s) to a question'
description: 'Set the tag to a question. Access: OWN, ADM'
tags:
- 'M03: Tags'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after deleting the tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful deleting tag. Redirect to question page.'
value: '/question/{id}'
302Error:
description: 'Failed to delete tag. Redirect to question page.'
value: '/question/{id}'
/api/users/{id}/manage_watch/tags:
post:
operationId: R402
summary: 'R402: Add a tag to follow.'
description: 'Add a tag to follow an ID. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
user:
type: integer
required:
- user
responses:
'302':
description: 'Redirect after watching tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful follow tag. Redirect to post page.'
value: '/question/{id}'
302Error:
description: 'Failed to follow tag. Redirect to post page.'
value: '/question/{id}'
delete:
operationId: R403
summary: 'R403: Unwatch tag.'
description: 'Unwatch a tag from an id. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after deleting the tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful deleting tag. Redirect to question page.'
value: '/question/{id}'
302Error:
description: 'Failed to delete tag. Redirect to question page.'
value: '/question/{id}'
/notifications:
delete:
operationId: R420
summary: 'R420: Delete all notifications from the user.'
description: 'Delete all notifications from the user. Access: USR'
tags:
- 'M04: Likes and Follows'
responses:
'302':
description: 'Redirect after removing removing the notifications.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful removed notifications. Redirect to home page.'
value: '/}'
/notifications{id}:
delete:
operationId: R421
summary: 'R421: Delete a certain notification from an user.'
description: 'Delete a certain notification id from an user. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: id
description: ID of the notification
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after removing removing the notification.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful removed notification. Redirect to home page.'
value: '/}'
/api/users/{id}/manage_ignore/tags:
post:
operationId: R308
summary: 'R308: Add a tag to ignore.'
description: 'Add a tag to ignore from an ID. Access: USR'
tags:
- 'M03: Tags'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
user:
type: integer
required:
- user
responses:
'302':
description: 'Redirect after iongoring tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful ignore tag. Redirect to post page.'
value: '/question/{id}'
302Error:
description: 'Failed to ignore tag. Redirect to post page.'
value: '/question/{id}'
delete:
operationId: R309
summary: 'R309: Remove ignore a tag.'
description: 'Remove ignore a tag from an id. Access: USR'
tags:
- 'M03: Tags'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after removing ignore the tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful remove ignore tag. Redirect to question page.'
value: '/question/{id}'
302Error:
description: 'Successful remove ignore tag. Redirect to question page.'
value: '/question/{id}'
/api/users/{id}/manage_follow/communitites:
post:
operationId: R410
summary: 'R410: Follow a community.'
description: 'Follow a community from an ID. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
user:
type: integer
required:
- user
responses:
'302':
description: 'Redirect after watching tag.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful follow tag. Redirect to post page.'
value: '/question/{id}'
302Error:
description: 'Failed to follow tag. Redirect to post page.'
value: '/question/{id}'
delete:
operationId: R411
summary: 'R411: Remove community follow.'
description: 'Remove community follow from an id. Access: USR'
tags:
- 'M04: Likes and Follows'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after removing follow from community.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful removing follow from community. Redirect to home page.'
value: '/'
302Error:
description: 'Failed removing follow from community. Redirect to home page.'
value: '/'
/communities:
get:
operationId: R601
summary : 'R601: Get the list of all communities.'
description: "Get the list of all communities."
tags:
- "M06: Communities"
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
tags:
type : array
items :
type : string
example:
tags: ["Animals", "Food"]
post:
operationId: R602
summary: 'R602: Create new community.'
description: 'Create a community. Access: USR'
tags:
- 'M06: Communities'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
name:
type: string
required:
- name
responses:
'302':
description: 'Redirect after creating community.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful to create community. Redirect to home.'
value: '/'
302Error:
description: 'Failed to create community. Redirect to home.'
value: '/'
/communities/{id}:
get:
operationId: R603
summary : 'R603: Get the questions of a certain community.'
description: "Get the questions of a certain communit id."
tags:
- "M06: Communities"
parameters:
- in: path
name: id
description: ID of the community
schema:
type: integer
required: true
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
tags:
type : array
items :
type : string
example:
tags: ["Animals", "Food"]
delete:
operationId: R604
summary: 'R604: Delete a community.'
description: 'Create a community. Access: OWN'
tags:
- 'M06: Communities'
parameters:
- in: path
name: id
description: ID of the post
schema:
type: integer
required: true
responses:
'302':
description: 'Redirect after removing community.'
headers:
Location:
schema:
type: string
examples:
302Success:
description: 'Successful to remove community. Redirect to home.'
value: '/'
302Error:
description: 'Failed to remove community. Redirect to home.'
value: '/'
/admin:
get:
operationId: R501
summary: 'R501: Admin page.'
description: 'Admin page. Access: ADM'
tags:
- 'M05: User Administration and Static pages'
responses:
'200':
description: 'Ok. Show Post admin Page'
/banid/{id}:
delete:
operationId: R502
summary: 'R502: Suspend/Ban User'
description : 'Suspend/Ban user. Access: ADM'
tags:
- 'M05: User Administration and Static pages'
parameters:
- in: path
name: id
schema:
type: integer
required: true
responses:
'300':
description: 'Ok. Redirect to admin Page'
/removequestion:
post:
operationId : R503
summary: 'R503: Remove question.'
description: 'Remove a certain question from an id. Access: ADM'
tags:
- 'M05: User Administration and Static pages'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
id:
type : integer
required:
- id
responses:
'300':
description: 'Ok. Redirect to admin Page'
/removeanswer:
post:
operationId : R504
summary: 'R504: Remove answer.'
description: 'Remove a certain answer from an id. Access: ADM'
tags:
- 'M05: User Administration and Static pages'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
id:
type : integer
required:
- id
responses:
'300':
description: 'Ok. Redirect to admin Page'
/about:
get:
operationId: R505
summary: 'R505: About page.'
description: 'About page. Access: PUB'
tags:
- 'M05: User Administration and Static pages'
responses:
'200':
description: 'Ok. Show About Page'
/faq:
get:
operationId: R506
summary: 'R506: FAQ page.'
description: 'FAQ page. Access: PUB'
tags:
- 'M05: User Administration and Static pages'
responses:
'200':
description: 'Ok. Show FAQ Page'
/contacts:
get:
operationId: R507
summary: 'R507: Contacts page.'
description: 'Contacts page. Access: PUB'
tags:
- 'M05: User Administration and Static pages'
responses:
'200':
description: 'Ok. Show Contacts Page'
```
**9. Implementation Details**
**9.1 Libraries Used**
Besides Laravel (the mandatory framework), we didn't use any library or framework to enhance our project
**9.2 User Stories**
| US Identifier | Name | Module | Priority | Team Members | State |
| -------- | -------- | -------- | -------- | -------- | -------- |
| US15 | Ask questions | M02 | High | **Rui Andrade** | 100%
| US16 | Comment | M02 | High | **Rui Andrade** | 100%
| US17 | Remove comments | M02 | High | **José Rodrigues** | 100%
| US05 | Access own Profile | M01 | High | **José Rodrigues** | 100%
| US10 | Sign-up | M01 | High | **Luís Cabral** | 100%
| US11 | Sign-in | M01 | High | **Luís Cabral** | 100%
| US01 | Browse questions | M02 | High | **Luís Cabral** | 100%
| US09 | Follow topics | M04 | High | **Bárbara Carvalho** | 100%
| US08 | Block content | M04 | Medium | **Bárbara Carvalho** | 100%
| US06 | Edit profile | M01 | Medium | **José Rodrigues** | 100%
| US26 | Delete posts | M02 | High | **Rui Andrade** | 100%
| US03 | Search topics | M03 | High | **Luís Cabral** | 100%
| US28 | Browse Questions by Tags | M03 | Medium | **Luís Cabral**, Bárbara Carvalho | 100%
| US02 | Access other profiles | M05 | High | **José Rodrigues** | 100%
| US14 | Edit posts | M02 | High | **Rui Andrade** | 100%
| US07 | Like posts | M04 | Medium | **Rui Andrade** | 100%
| US29 | View my posts | M02 | High | **José Rodrigues** | 100%
| US20 | Join communities | M06 | Medium | **Bárbara Carvalho** | 100%
| US21 | Create communities | M06 | Medium | **Bárbara Carvalho** | 100%
| US22 | Answer to question notification | M05 | High | **Bárbara Carvalho** | 100%
| US23 | Vote on post notification | M05 | High | **Bárbara Carvalho** | 100%
| US30 | Search users | M05 | Medium | **Luís Cabral** | 100%
| US18 | Ban users | M05 | High | **José Rodrigues** | 50%
| US24 | View top questions | M02 | Medium | **Rui Andrade** | 100%
| US25 | View recent questions | M02 | Medium | **Rui Andrade** | 100%
| US27 | Mark answer as correct | M02 | Medium | **Rui Andrade** | 100%
| US04 | Consult FAQ | M05 | Low | **Luís Cabral** | 100%
| US19 | Tag topics | M03 | Medium | | 0%
| US12 | OAuth API Sign-up | M01 | Low | -
| US13 | OAuth API Sign-up | M01| Low | -
# A10: Presentation
**1. Product Presentation**
Askit is an information system for users to exchange knowledge through questions and answers. Users who have a particular question or want to help other users on subjects which they master can use this product to easily achieve their objectives.
Through its search engine, various communities and tags system every last bit of information can be found or requested which makes sharing information much easier.
URL to the product: http://lbaw22112.lbaw.fe.up.pt
**2. Video presentation**
Submitted in moodle
**GROUP22112, 03/01/2023**
* Luís Tiago Trindade Cabral, up202006464@edu.fe.up.pt
* Bárbara Filipa da Silva Carvalho, up202004695@edu.fe.up.pt
* Rui Brogueira Andrade, up202007539@edu.fe.up.pt
* José Miguel Carvalho Rodrigues, up201809590@edu.fc.up.pt