Introduction

This project portfolio has been written to elaborate on my contributions to a team-based software engineering project in the NUS Computing module CS2103T.

In this module, my team of five was tasked to create an application, by morphing the Address Book - Level 3.

Constraints

We had the the following constraints:

Target Consumer:
  • The product should be targeting users who can type fast and prefer typing over other means of input.

Solution
  • For this constraint, we ensured that the majority of the user’s interactions with the application are through the Command Line Interface (CLI), which implies that users have to type commands and instructions, instead of using a Graphical User Interface(GUI).

Application requirements:
Solution
  • This means that we had to morph the existing Address Book into another application. However, we were allowed to transform the concept of the application by incrementally changing the code.

Product - TravEzy

Keeping the above constraints in mind, we created TravEzy, a desktop-based CLI travel application. Our application erases the logistical nightmare that haunts regular travellers.

Instead of having to deal with several applications to organise and document a single trip, users can now combine critical travel applications such as calendars, itinerary planners, diaries and budgeting tools into one convenient and intuitive interface.

Our product is for NUS students who are avid travellers. Given their busy schedules and love for travelling, TravEzy is the optimal solution for their travel needs.

Overview of my contributions

I took up the responsibility of implementing the Diary Feature , end to end, in TravEzy. While this was my main task, I also worked on the common code base and design.

In addition, I provided structure and content for critical documentation such as the User and Developer guides. I shall elaborate more in the following sections.

Summary of contributions

Given that the largest feature that I implemented was the Diary, I have discussed it in detail below.

Diary Feature

DiaryPPP

Introduction to the feature:

  • The Diary Feature represents a real-life diary. In this implementation, every user has a Diary Book which contains a list (in the form of a Diary List) of all his/her Diary Entries.

Market Validation:

  • As part of our market validation process, we observed that most student travellers enjoy journaling and recording their trips in a text format. This feature allows for users to do exactly that, with some additional features to increase convenience and usability.

Highlights:

Other than being able to add, delete and display diary entries, this implementation of the diary feature also allows users to find specific entries and encrypt private memories to keep them safe.

find and findSpecific

Looking through a large number of diary entries can be challenging, and that’s why, I implemented a basic find command which allows users to run through all their entries quickly and find entries which match their query. The findSpecific command takes this functionality to the next level by allowing users to segment their diary entries based on the different componenets of an entry (Title, Date etc)

setDetails

Most diaries are for personal thoughts and opinions, and thus, I implemented the private command which allows users to protect their memories. In order to further safeguard entries, I implemented the setDetails command which allows users to password protect their memories. Finally, to fully protect the users, I encrypted their data to ensure that no unauthorised users can read private information straight from the storage files.

Code contributed: Code

Other Contributions

Other contributions:

  • Delay Function

    • Added a delay function which allows users to see an exit message when leaving the application Delay

  • Solve Common Bugs

  • Project management:

    • Created and managed milestones (V1.1 - V1.3)

    • Created and managed labels

    • Enabled Autopublishing of documentation using Travis

    • Provided feedback and input to teammates 21, 22

  • Documentation:

    • Personalised the About us, Contact, Product Website 1, 2, 3, 4, 5, 6, 7

    • Transformed the structure and language of the User Guide and Developer Guide to increase readability and make it more user friendly. 8, 9, 10

Contributions to the User Guide

In this section, I shall be sharing some of the portions from the TravEzy Userguide which I wrote. I shall be focusing on the find, findSpecific and setDetails commands. They showcase my ability to write documentation targeting end-users.

Find diary entries find

"Hey, when did I go to Spain?" It can be hard to remember all the details of your trips. That’s why, this Diary lets you look through all your entries quickly, to give you the entry that you want!

Format:
find TARGET

Example:

find rugby
To search for Dates, enter them in the same format as before, when you added the Diary Entry (dd/mm/yyyy HHMM)

Step by step:

That was the craziest Rugby World Cup ever! Who lost?

Step 1: Type find rugby into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.

DiaryFindBefore

Step 2: TravEzy will tell you if your find command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.

Step 3: You can see the matching Diary Entries in your Diary List Panel, similar to number 3 in the picture below.

DiaryFindAfter

Find specific diary entries findSpecific

Let’s narrow down your search! The Diary allows you to look through specific sections of each Diary Entry to find the exact entry that you want!

Format:
findSpecific [t/TITLE] [d/DATE TIME] [p/PLACE] [m/MEMORY]

Example:

findSpecific d/12/12/2019

Step by step:

You know that you had a trip on the 12th of December 2019, but you can’t remember what you did…​

Step 1: Type findSpecific d/12/12/2019 into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.

DiaryFindSpecificBefore

Step 2: TravEzy will tell you if your findSpecific command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.

Step 3: You can see the specific matching Diary Entries in your Diary List Panel, similar to number 3 in the picture below.

DiaryFindSpecificAfter

Keep your diary protected setDetails

You never know who may use your laptop when you’re away. The Diary can help you to protect your memories to stop hackers from looking at your private memories with a username and password. If you setDetails, you will not be able to use the unprivate command and will have to use the unlock command (See below).

Format:
setDetails user/USERNAME password/PASSWORD

Example:

setDetails user/youcanthackme password/youreallycanthackme
You can only set your details once! After that, you will have to delete TravEzy if you forget your password and need to unlock entries. This is done to ensure NO ONE misues your personal information
Keep your username and password long to keep those pesky hackers out! Minimally, make sure your username and password are alphanumeric and 8 characters long

Step by step:

Better set a password to protect your memories against prying eyes

Step 1: Type setDetails user/youcanthackme password/youreallycanthackme into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.

DiarySetDetailsBefore

Step 2: TravEzy will tell you if your unprivate command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.

DiarySetDetailsAfter

Contributions to the Developer Guide

Given below is a sample of the sections that I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project.

Sequence of Find Command

DiaryFindCommandSequenceDiagram
Figure 1. Sequence Diagram for the Find Command

Above, we have the sequence diagram for the FindCommand in the Diary. In this case, we have taken the scenario of finding any DiaryEntries which contain the word "temp".

Process:

  1. Upon receiving the instruction from Logic to parse the input find temp, the DiaryBookParser begins parsing the input to match it (based on the Command Word) to the appropriate Parser

  2. In this case, given that the Command Word is find the appropriate Parser is the FindCommandParser, which is created and then begins to parse("temp")

  3. This in turn creates a new FindPredicate, based on the input temp. This FindPredicate will be used to filter through the DiaryModel to get the matching DiaryEntries

  4. With the FindPredicate, a new FindCommand is created which is returned to logic and executed

  5. This execution leads to the find(temp) command being executed on the DiaryModel, which returns the updated DiaryModel with the matching DiaryEntries

  6. This model is then returned to the user in the form of the Command Result, and is visible on the GUI in the form of a list of the matching DiaryEntries.

The lifeline for FindCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.

Logic of Unprivate and Unlock Commands

Given the similar function of the 2 commands, unprivate and unlock, there is a more detailed explanation of the differences between the commands below.

DiaryUnPrivateActivityDiagram
Figure 2. Activity Diagram for the Unprivate Command

Above, is the logical flow for the Unprivate Command. In brief, it allows a user to unprivate any private entry IF there are no Details set. As a result, the command can be input like this:

unprivate 1

1 is the index of the Diary Entry which is to be unprivated
DiaryUnLockActivityDiagram
Figure 3. Activity Diagram for the UnLock Command

Above, is the logical flow for the Unlock Command. In brief, it allows a user to unlock any private entry IF there are Details and the Details input by the user match the original Details set by the user.As a result, the command can be input like this:

unlock 1 user/username password/password

1 is the index of the Diary Entry which is to be unlocked and user/username and password/password are the relevant Details.

In summary, the unlock command is only to be used when the user has already set Details. Otherwise, the user has to use the unprivate command to see private DiaryEntries