FEUP-ESOF-2020-21 / open-cx-t1g3-pantufas

open-cx-t1g3-pantufas created by GitHub Classroom
1 stars 0 forks source link

openCX-DroneYourFood Development Report

Welcome to the documentation pages of the Drone your Food of openCX!

You can find here detailed about the (sub)product, hereby mentioned as module, from a high-level vision to low-level implementation decisions, a kind of Software Development Report (see template ), organized by discipline (as of RUP):

So far, contributions are exclusively made by the initial team, but we hope to open them to the community, in all areas and topics: requirements, technologies, development, experimentation, testing, etc.

Please contact us!

Thank you!

Made By:


Product Vision

Deliver food quickly and seamlessly to conference participants.


Elevator Pitch

Conference participants waste a lot of time in lines and changing seats when getting food. Our company helps them feel more immersed in the conference by quickly and confortably delivering food and beverages just with a few taps on their phones. What makes our approach unique is the use of new drone technology to bypass any obstacle and make deliveries as fast as possible.


Requirements

Our application aims to provide the users with the ability to select products, place orders and to have them delievered by a flying drone.

This application requires:

Use case diagram

Use cases

Check products database

Make Order

Change Order

Cancel Order

Deliever Order

User stories

User story map

User story map

User story 1

As a customer, I want to consult the products available for sale.

Feature: Consulting available products.

  Scenario: Available products are present when the user taps the products list button
  Given I am logged in
  And I am in the "home" page
  When I am tap the "products list" button
  Then I expect the available products to be present

  Scenario: Product categories are present when the user taps the category list button
  Given I am logged in
  And I am in the "home" page
  When I tap the "category list" button
  Then I expect the "available products" categories to be present

  Scenario: Products of a certain category are present when I tap the button of that category
  Given I am logged in
  And I am on the "category list" page
  When I tap a "category" button
  Then I expect the available products from that category to be present

User story 2

As a customer, I must log in into my account to place orders.

 Feature: Log In 
 Scenario: The user inputs his email and password to log in
 Given: I have a registered account in DroneYourFood
 When: I enter my email.
 And: I enter my password
 Then: I should be redirected to the "home" page
 Feature: Sign In 
 Scenario: The user inputs his email and password to sign in
 Given I am not logged in
 When I enter an email
 And I enter an password
 Then my account should be created

User story 3

As a customer, I want to be able to order food/drinks from the available products.

 Feature: Add products to cart.
 Scenario: the product is added to the user's cart when it is tapped
 Given I am logged in
 And I am on the "products list" page
 When I tap a "product" card
 Then that product should be added to my cart
 And the text "Added product to cart" should be present

User story 4

As a customer, I want to have food delivered to me, so I don't have to get up from my seat.

>

 Feature: Receive the order.
 Scenario: the user receives the food after the order has been placed
 Given the order has been placed
 When the order is ready for delivery
 Then the drone brings the food to the selected place

User story 5

As a customer, I want to be able to check my profile.

 Feature: Check profile.
 Scenario: User can navigate to his profile page by tapping the profile button
 Given I am logged in
 When I press the profile button
 Then my profile's page is loaded

User story 6

As a customer, I want to have multiple payment methods available to me.

 Feature: Select payment method.
 Scenario: The user selects a payment method by tapping the desired method 
 Given I have specified my order details
 When I tap a payment method
 Then I can use that method to pay for my order

User story 7

As a customer, I want to be able to choose the delivery spot for my orders.

 Feature: Select delivery place.
 Scenario: The user selects a place 
 Given I have placed an order
 When I am on the checkout page
 Then I select the order delivery spot

User story 8

As a customer, I want to be able to change my order.

 Feature: Change order.
 Scenario: The user changes the order after placing one 
 Given I have placed an order
 When I am on the checkout page
 Then I go back to the cart page

User story 9

As a customer, I want to be able to cancel my order.

 Feature: Cancel order.
 Scenario: The user cancels the order after placing one
 Given I have placed an order.
 When I am on the checkout page
 Then I cancel my order

User story 10

As a user, I want to be able to recover my password.

 Feature: Recover password.
 Scenario: My password is updated when I input a new password.
 Given I have pressed the "Recover my password" button
 When I input my new password
 Then I my password is updated

User story 11

As a user, I want to change my profile picture.

 Feature: Change profile picture.
 Scenario: The profile picture is updated when user uploads a different one.
 Given I have pressed the "Change my profile picture" button
 When I upload a new picture
 Then my profile picture is updated

User story 12

As a user, I want to be able to see my purchase history.

 Feature: Purchase history.
 Scenario: The purchase history is displayed when the user goes to the history page.
 Given I have made purchases in the past
 When I go to the purchases page
 Then I can see my purchase history

User story 13

As a user, I want to filter products by category.

 Feature: Filter products by category.
 Scenario: The available products from a certain category are shown to the user.
 Given I am on the "Category List" page
 When I press a category
 Then I can see the available products of that category 

User story 14

As a user, I want to be able to sign out of my account.

 Feature: Sign Out
 Scenario: The user can logout when logged in.
 Given I am logged in
 When I press sign out button
 Then I log out

Domain model

Our app allows for the registration of users so that we can store their orders.

Each order contains products which the user can choose.

Orders are then managed by the server that mediates the communication with the delivery drones.

Domain Model


Architecture and Design

Logical architecture

Our application is divided into the following packages:

logical diagram

Physical architecture

physical architecure diagram

Regarding the phyical architecure of our project, it is divided in the following parts:

Regarding the technologies we'll be using on the development of the application, we decided to use Flutter because it speed up the development process and provides an abstraction to android and iOS systems. It is also used in open-cx making the app easier to integrate with, if necessary. We decided to go with Firebase for storage and authentication application, because it is free, provides all the functionalities needed and Flutter integrates well with it. The drones will be controlled using a python server. We chose Python because of our familiarity with the language and due to the Tello sdk provides code examples in this language. Finally, we were provided a Tello drone by the university.

Prototype

At the end of our first iteration, we have implemented the user story As a customer, I want to consult the products available for sale. This gave us some basic understanding of Flutter and serves as a very early example of what the application will be and what it will look like. In this iteration we have used a JSON file instead of a Firebase instance to store the product's data (this will be changed later). The prototype has the basis of the theme we intend to use. This theme will be improved further.

Implementation

ScrollColumn

This component was created for pages that have their layout based on a main Column. Columns can overflow the screen, which is a big problem for smaller devices. This component wraps a Column and gives it a scrollbar when it would overflow the screen. This way, the user can scroll in order to see all the information and the overflow is avoided.

ShoppingCart

The code works around the user's ShoppingCart instance. This class is a singleton, which means it can be easily accessed from everywhere on the code, both to get information (avoiding some requeries/parsing from the Firebase instance) and inserting new information (the formatting and uploading is handled internally).
Since this class holds most of the core information of the application, it is possible to register yourself as an observer (by passing a funtion to the notifyWhenLoaded method), that will be run when the ShoppingCart loading process is done. The project uses this in conjunction with the setState method of Flutter's stateful widgets in order to show loading screens/placeholders while the information is not ready, e.g.: list of products on the shopping cart (ShoppingListWidget class, getShoppingItems method).

Tests mock injection

There are places (e.g.: profile) where we have used/created an extra class, so we can inject mocks (using Mockito). This helps writting better unit tests quickly.

Interfacing with drones

Unfortunately, the drones we had access to during the development of this project had no GPS/way-point support. This means the interfacing with Tello drones exists, but is not used in the app's code.

There is a DroneCommand class that sends commands to a drone. There is a wrapper to interface with this class in the Tools class. This class has a final field that should contain the ip address/domain and port to communicate with the server.

The server is written in python. It responds to POST requests containing commands (in plain text). The server class contains an instance of the Tello class. This class takes care of the lower level drone interaction, logs every interaction and allows an admin user to send commands directly to the drone thought the standard input (stdin). The main missing feature of this server is the limitation of working with a single drone. This can be easily improved by having a queue of Tello class instances, each interfacing with a single drone. We didn't take care of this because, we wouldn't be able to test the feature.


Test

Test Plan

The features we have decided to test were the ones neither dependent on the drone or Firebase since these are out of our reach. Data classes and getters should be ignored for testing, as well. This meant the test plan should consist of three parts:

Test Case Specification

Acceptance Tests

Tested using flutter_gherkin package.

Unit Tests

For each test we check if each widget is being displayed as intended and if it shows the intended information.


Configuration and change management

For the purpose of ESOF, we used a very simple approach, just to manage feature requests, bug fixes, and improvements, using GitHub issues and following the GitHub flow.


Project management

We are using Github Projects to manage our tasks. Use this link to check what we are up to.


Evolution - contributions to open-cx

We did not integrate our application with open-cx.