---
# System prepended metadata

title: 'EAP: Architecture Specification and Prototype'

---

# EAP: Architecture Specification and Prototype

The Super Legit Collaborative News (SLCN) is a project headed by a small group of developers with the main goal of free, open, and accessible news sharing for and by users.

This will allow all users to view and browse all types of news and comments on any topic, with access to text search and tag selection.

## A7: Web Resources Specification

This artifact documents the architecture of the [web application](https://clickysoft.com/web-application-examples/) to be developed, indicating the catalog of resources, the properties of each resource, and the format of JSON responses. This specification adheres to the OpenAPI standard using YAML.

This artifact presents the documentation for SLCN (Super Legit Collaborative News), including the CRUD (create, read, update, delete) operations for each resource.

### 1. Overview


<table>
  <tr>
    <th>M01: Authentication</th>
    <td>
        Web resources associated with user authentication and individual profile management. Includes the following system features: login/logout, registration, password recovery, view and edit personal profile information.
    </td>
  </tr>
    <th>M02: Users</th>
    <td>
        Web resources associated with the interaction with other users. Includes the following: view and search user's profile and follow users.
    </td>
  </tr>
  <tr>
    <th>M03: News</th>
    <td> Web resources associated with news items. Includes the following system features: news list and search, creation, deletion, editing, voting and favoriting. </td>
  </tr>
  <tr>
    <th>M04: Comments</th>
    <td> Web resources associated with comments. Includes the folllowing system features: comment creation, deletion, editing and voting.</td>
  </tr>
  <tr>
    <th>M05: Tags</th>
    <td> Web resources associated with tags. Includes the folllowing system features: tag creation, search, deletion and following. </td>
  </tr>
  <tr>
    <th>M06: Notifications</th>
    <td>
        Web resources associated with notifications.
    </td>
  </tr>
    <tr>
    <th>M07: Reports</th>
    <td>Web resources associated with reports. Includes the folllowing system features: report creation and processing.</td>
  </tr>
  <tr>
    <th>M08: Search</th>
    <td>
        Web resources associated with searching user, news and comments.</td>
  </tr>
    <tr>
    <th>M09: User Administration and Static pages</th>
    <td>
        Web resources associated with user, news, comments, tags and reports specifically: view, search, delete or block information and details. Web resources with static content are associated with this module: about us, contact, services and faq.</td>
  </tr>
</table>


### 2. Permissions

<table>
  <tr>
    <th> PUB </th>
    <td>Public</td>
    <td>User without privileges</td>
  </tr>
  <tr>
    <th> USR </th>
    <td>User</td>
    <td>Authenticated users</td>
  </tr>
  <tr>
    <th>AUTH</th>
    <td>Author</td>
    <td>Users that are authors of the information (e.g. own profile, own news, own comments)</td>
  </tr>
  <tr>
    <th> ADM </th>
    <td>Administrator</td>
    <td>System administrators</td>
  </tr>
</table>

### 3. OpenAPI Specification

[a7_openapi.yaml](https://git.fe.up.pt/lbaw/lbaw2223/lbaw2286/-/blob/main/a7_openapi.yaml)


```yaml
openapi: 3.0.0

info:
 version: '1.0'
 title: 'LBAW SLCN Web API'
 description: 'Web Resources Specification (A7) for SLCN'

servers:
- url: http://lbaw2286.lbaw.fe.up.pt
  description: Production server

externalDocs:
 description: Find more info here.
 url: https://git.fe.up.pt/lbaw/lbaw2223/lbaw2286/-/wikis/home

tags:
 - name: 'M01: Authentication'
 - name: 'M02: Users'
 - name: 'M03: News'
 - name: 'M04: Comments'
 - name: 'M05: Tags'
 - name: 'M06: Notifications'
 - name: 'M07: Reports'
 - name: 'M08: Search'
 - name: 'M09: User Administration and Static Pages'

paths:
     /login:
       get:
         operationId: R101
         summary: 'R101: Login Form'
         description: 'Provide login form. Access: PUB'
         tags:
           - 'M01: Authentication'
         responses:
           '200':
             description: 'Ok. Show Log-in UI10'
       post:
         operationId: R102
         summary: 'R102: Login Action'
         description: 'Processes the login form submission. Access: PUB'
         tags:
           - 'M01: Authentication'

         requestBody:
           required: true
           content:
             application/x-www-form-urlencoded:
               schema:
                 type: object
                 properties:
                   email:  # <!--- form field name
                     type: string
                   password: # <!--- form field name
                     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 main page.'
                     value: '/'
                   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'
         responses:
           '302':
             description: 'Redirect after processing logout.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Success:
                     description: 'Successful logout. Redirect to main page.'
                     value: '/'
                   302Failure:
                     description: 'Failed logout. Redirect to main page.'
                     value: '/'

     /register:
       get:
         operationId: R104
         summary: 'R104: Register Form'
         description: 'Provide new user registration form. Access: PUB'
         tags:
           - 'M01: Authentication'
         responses:
           '200':
             description: 'Ok. Show Sign-Up UI09'

       post:
         operationId: R105
         summary: 'R105: Register Action'
         description: 'Processes the new user registration form submission. Access: PUB'
         tags:
           - 'M01: Authentication'

         requestBody:
           required: true
           content:
             application/x-www-form-urlencoded:
               schema:
                 type: object
                 properties:
                   username:
                     type: string
                   email:
                     type: string
                   password:
                     type: string
                 required:
                          - username
                          - email
                          - password
         responses:
           '302':
             description: 'Redirect after processing the new user information.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Success:
                     description: 'Successful authentication. Redirect to main page.'
                     value: '/'
                   302Failure:
                     description: 'Failed authentication. Redirect to login form.'
                     value: '/login'
     /profile/{id}:
      get:
        operationId: R201
        summary: "R201: Gets a profile page of a user."
        description: "Displays profile page of a user. Access: USR"
        tags:
          - 'M02: Users'
        responses:
         '200':
           description: 'Ok. Show Profile page [UI03]'
         '302':
             description: 'Redirect.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Failure:
                     description: 'Redirect to login page.'
                     value: '/login'

     /edit_profile/{id}:
      post:
        operationId: R202
        summary: "R202: Displays User edit page."
        description: "Display edit page for a user's profile. Access: AUTH, ADM"
        tags:
          - 'M02: Users'
        requestBody:
           required: true
           content:
             application/x-www-form-urlencoded:
               schema:
                 type: object
                 properties:
                   id:
                     type: integer
                 required:
                          - id
        responses:
           '302':
             description: 'Redirect.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Success:
                     description: 'Redirect to profile edit page.'
                     value: '/edit_profile/{id}'
                   302Failure:
                     description: 'Redirect to profile page.'
                     value: '/profile/{id}'

     /api/edit_profile/{id}:
      post:
        operationId: R203
        summary: "R203: Edits a user's profile."
        description: "Processes and edits a user's profile. Access: AUTH, ADM"
        tags:
          - 'M02: Users'
        requestBody:
           required: true
           content:
             application/x-www-form-urlencoded:
               schema:
                 type: object
                 properties:
                   id:
                     type: integer
                   username:
                     type: string
                   country:
                     type: string
                   email:
                     type: string
                   password:
                     type: string
                 required:
                          - id
                          - username
                          - country
                          - email
                          - password
        responses:
           '302':
             description: 'Redirect.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Success:
                     description: 'Redirect to profile page.'
                     value: '/profile/{id}'
                   302Failure:
                     description: 'Redirect to profile edit page.'
                     value: '/edit_profile/{id}'

     /change_admin/{id}:
      post:
        operationId: R204
        summary: "R204: Changes a users admin role."
        description: "Changes a users admin role. If the user is an admin, they lose the role and vice-versa. Access: ADM"
        tags:
          - 'M02: Users'
        requestBody:
           required: true
           content:
             application/x-www-form-urlencoded:
               schema:
                 type: object
                 properties:
                   id:
                     type: integer
                 required:
                  - id
        responses:
           '302':
             description: 'Redirect.'
             headers:
               Location:
                 schema:
                   type: string
                 examples:
                   302Success:
                     description: 'Redirect to profile page.'
                     value: '/profile/{id}'
                   302Failure:
                     description: 'Redirect to profile page.'
                     value: '/profile/{id}'

     /:
      get:
        operationId: R301
        summary: 'R301: Shows home feed.'
        description: 'Obtains page with the most popular news items. Access; PUB'
        tags:
          - 'M03: News'
        responses:
          '200':
            description: 'Ok. Show home feed [UI01]'

     /news/{id}:
      get:
        operationId: R302
        summary: 'R302: Shows news item.'
        description: 'Obtains page with the selected news item. Access; USR'
        tags:
          - 'M03: News'
        parameters:
          - in: path
            name: id
            schema:
              type: integer
            required: true
        responses:
          '200':
            description: 'Ok. Show news item [UI02]'
          '302':
            description: 'User not logged in. Redirect to login form'
            headers:
              Location:
                schema:
                  type: string
                examples:
                  302Failure:
                    description: 'User not logged in. Redirect to login page.'
                    value: '/login'

     /api/news:
      post:
        operationId: R303
        summary: 'R303: News creation action.'
        description: 'Processes the new news item form submition and creates the news item. Access; USR'
        tags:
          - 'M03: News'
        requestBody:
          required: true
          content:
            application/x-www-form-urlenconded:
              schema:
                type: object
                properties:
                  title:
                    type: string
                  content:
                    type: string
                  picture:
                    type: object
                  id_author:
                    type: integer
                required:
                  - title
                  - content
                  - id_author

        responses:
          '302':
            description: 'Redirect after processing new news item.'
            headers:
              Location:
                schema:
                  type: string
                examples:
                  302Success:
                    description: 'Successful news creation. Redirection to news item.'
                    value: '/news/{id}'
                  302Failure:
                    description: 'Failure in news creation. Redirection to home page.'
                    value: '/'

     /api/news/{news_id}:
      post:
        operationId: R304
        summary: "R304: Deletes a news item"
        description: "Deletes a news item; Access: AUTH, ADM"
        tags:
          - 'M03: News'
        requestBody:
          required: true
          content:
            application/x-www-form-urlenconded:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                required:
                  - id
        responses:
          '302':
            description: 'Redirect after processing and deleting news item.'
            headers:
              location:
                schema:
                  type: string
                examples:
                  302Sucess:
                    description: 'Successful news deletion. Redirection to home page.'
                    value: '/'
                  302Failure:
                    description: 'Failure in news deletion. Redirection to news page.'
                    value: '/news/{id}'

     /api/news/update/{news_id}:
      post:
        operationId: R305
        summary: "R305: Edits a news item"
        description: "Processes and edits a news item; Access: AUTH, ADM"
        tags:
          - 'M03: News'
        requestBody:
          required: true
          content:
            application/x-www-form-urlenconded:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  title:
                    type: string
                  content:
                    type: string
                  picture:
                    type: object
                  id_author:
                    type: integer
                required:
                  - id
                  - title
                  - content
                  - id_author
        responses:
          '302':
            description: 'Redirect after editing news item.'
            headers:
              location:
                schema:
                  type: string
                examples:
                  302Success:
                    description: 'Successful news update. Redirection to news page.'
                    value: '/news/{id}'
                  302Failure:
                    description: 'Failure in news update. Redirection to news page.'
                    value: '/news/{id}'
     /search:
       get:
        operationId: R801
        summary: 'R801: Search for news posts or users'
        description: 'Search for news posts or users. Access: PUB'
        tags:
          - 'M09: Search'
        requestBody:
          required: true
          content:
            application/x-www-form-urlencoded:
              schema:
                type: object
                properties:
                  query:
                    type: string
                required:
                  - query
        responses:
          '302':
            description: 'Redirect after processing the query.'
            headers:
              Location:
                schema:
                  type: string
                examples:
                  302Success:
                    description: 'Successful search. Redirect to search results page.[UI05]'
                    value: '/search/{query}'
                  302Failure:
                    description: 'Failed search. Redirect to home page.'
                    value: '/'
          '400':
            description: 'Bad Request'

```

---


## A8: Vertical prototype

This artifact pertains to the vertical prototype of the project and it contains the list of implemented user stories and web resources.

### 1. Implemented Features

#### 1.1. Implemented User Stories


| User Story reference | Name                   | Priority                   | Description                   |
| -------------------- | ---------------------- | -------------------------- | ----------------------------- |
| US01     | View Top News Feed |High |at I can view all the most relevant news available. |
| US02 | View News Item | High | As a User, I want to access a single News Item so that I can read a more detailed version of it. |
| US03 | Search | High | As a User, I want to search for a specific tag, comment, or news item so that I can find that information quicker. |
| US04 | View News Item Comments | Medium | As a User, I want to view the comments of each news item, so that I can know detailed people's opinions about that news item.|
| US05 | View Other Users' Profiles | Medium | As a User, I want to view the profiles of other people, so that I can check their reputation, and news and comment history. |
| US10 | Sign-in | High | As a Visitor, I want to be able to authenticate so that I can have access to a lot of new features on the platform. |
| US11 | Sign-up | High | As a Visitor, I want to be able to create an account in the system so that I can authenticate and have my profile. |
| US13 | Create News Item | High | As an Authenticated User, I want to create and publish a news item, so that it becomes available to other users. |
| US14 | Sign-out | High | As an Authenticated User, I want to sign out from my account, so that I can end the login session. |
| US15 | Edit Profile | High | As an Authenticated User, I want to edit my profile so that I can keep my personal information updated. |
| US16 | View Personal Profile | High | As an Authenticated User, I want to view my user profile so that I can check my post and comment history, and personal information and have an option to edit it. |
| US17 | View User News Feed | High | As an Authenticated User, I want to view a custom news feed so that I can have access to all the news of the people and tags that I am following. |
| US29 | Edit News Item | Medium | As a News Author, I want to edit one of my published articles, so that I can correct/update said article. |
| US30 | Delete News Item | Medium | As a News Author, I want to remove one of my published articles, so that it disappears from the platform. |
| US36 | Administer User Accounts | High | As an Administrator, I want to search, view, edit and create user accounts so that I can manage them accordingly. |
| US38 | Manage User Accounts | Medium | As an Administrator, I want to manage user accounts so that the users have access to the platform only when they comply with the guidelines. | 
| US40 | Manage Content | Low | As an Administrator, I want to manage users' content so that no forbidden content is on the platform. |

#### 1.2. Implemented Web Resources


<b>Module M01: Authentication</b>b>

| Web Resource Reference | URL                            |
| ---------------------- | ------------------------------ |
| R101: Login Form | /login |
| R102: Login Action | /login |
| R103: Logout Action | /logout |
| R104: Register Form | /register |
| R105: Register Action | /register |


<b>Module M02: Users</b>

| Web Resource Reference | URL                            |
| ---------------------- | ------------------------------ |
| R201: Gets a profile page of a user | /profile/{id}|
| R202: Displays User edit page | /edit_profile/{id} |
| R203: Edits a user's profile | /api/edit_profile/{id} |
| R204: Changes a users admin role | /change_admin/{id} |


<b>Module M02: News</b>

| Web Resource Reference | URL                            |
| ---------------------- | ------------------------------ |
| R301: Shows home feed | /news/{id} |
| R302: Shows news item | / |
| R303: News creation action | /api/news |
| R304: Deletes a news item | /api/news/{news_id} |
| R305: Edits a news item | /api/news/update/{news_id} |

<b>Module M08: Search</b>
| Web Resource Reference | URL                            |
| ---------------------- | ------------------------------ |
| R801: Search for news posts or users | /search |




### 2. Prototype

Prototype available at: https://lbaw2286.lbaw.fe.up.pt/
Prototype source code available at: https://git.fe.up.pt/lbaw/lbaw2223/lbaw2286/-/tree/EAP

Admin Credentials:
email: admin@example.com
password: 1234

---


## Revision history


***
lbaw2223-t8g6, 23/11/22
 
- André Morais, up202005303@edu.fe.up.pt (editor)
- João Teixeira, up202005437@edu.fe.up.pt
- Lucas Sousa, up202004682@edu.fe.up.pt
- Rui Soares, up202103631@edu.fe.up.pt



