Skip to content

Commit

Permalink
Merge 826a51a into f3571ed
Browse files Browse the repository at this point in the history
  • Loading branch information
ChooJeremy committed Nov 3, 2018
2 parents f3571ed + 826a51a commit 70c2ea9
Show file tree
Hide file tree
Showing 18 changed files with 165 additions and 39 deletions.
9 changes: 6 additions & 3 deletions docs/UserGuide.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,19 @@ Pressing the kbd:[↑] and kbd:[↓] arrows will display the previous and

Adds an employee into the system.

Format: `add -n NAME -e EMAIL -n NUMBER -s SALARY -a ADDRESS [-t PROJECT]`
Format: `add -n NAME -e EMAIL -n NUMBER -s SALARY -a ADDRESS [-u USERNAME] [-t PROJECT]`

* If username is not specified, it will default to being the same as NAME.

****
* To use this command, you must be logged in with "Add employee" permissions.
* Once added, the new user will have the same username as the name entered. We are working on having the username be available as an optional field
* Username must be unique among everyone else in the system.
* The username cannot be "Admin", as that is reserved for the admin account.
****
Examples:

* `add -n Joshua -s 15000 -e josh@gmail.com -n 81234567 -a 81 Joshua's Road Singapore 123456`
* `add -n Raynard -e rnardha@gmail.com -n 91235678 -s 1000 -a somewhere on earth`
* `add -n Raynard -e rnardha@gmail.com -n 91235678 -s 1000 -a somewhere on earth -u Nard`

=== Listing all persons : `list`

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package seedu.address.commons.exceptions;

/**
* Signals that some given data does not fulfill some constraints.
*/
public class IllegalUsernameException extends RuntimeException {

private String username;

/**
* @param message should contain relevant information on the failed constraint(s)
*/
public IllegalUsernameException(String message) {
super("The following username: " + message + " already exists in the system!");
username = message;
}

/**
* @param message should contain relevant information on the failed constraint(s)
* @param cause of the main exception
*/
public IllegalUsernameException(String message, Throwable cause) {
super("The following username: " + message + " already exists in the system!", cause);
username = message;
}

public String getUsername() {
return username;
}
}
7 changes: 7 additions & 0 deletions src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_USERNAME;

import seedu.address.logic.CommandHistory;
import seedu.address.logic.commands.exceptions.CommandException;
Expand All @@ -28,6 +29,7 @@ public class AddCommand extends Command {
+ PREFIX_EMAIL + " EMAIL "
+ PREFIX_SALARY + " SALARY "
+ PREFIX_ADDRESS + " ADDRESS "
+ "[" + PREFIX_USERNAME + " USERNAME] "
+ "[" + PREFIX_PROJECT + " PROJECT]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_NAME + " John Doe "
Expand All @@ -39,6 +41,7 @@ public class AddCommand extends Command {

public static final String MESSAGE_SUCCESS = "New person added: %1$s";
public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book";
public static final String MESSAGE_DUPLICATE_USERNAME = "This username already exists in the address book";

private final Person toAdd;

Expand All @@ -59,6 +62,10 @@ public CommandResult runBody(Model model, CommandHistory history) throws Command
throw new CommandException(MESSAGE_DUPLICATE_PERSON);
}

if (model.alreadyContainsUsername(toAdd.getUsername().username, null)) {
throw new CommandException(MESSAGE_DUPLICATE_USERNAME);
}

model.addPerson(toAdd);
model.commitAddressBook();
return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_USERNAME;

import java.util.Set;
import java.util.stream.Stream;
Expand Down Expand Up @@ -36,7 +37,7 @@ public class AddCommandParser implements Parser<AddCommand> {
public AddCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,
PREFIX_SALARY, PREFIX_PROJECT);
PREFIX_SALARY, PREFIX_USERNAME, PREFIX_PROJECT);

if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_SALARY)
|| !argMultimap.getPreamble().isEmpty()) {
Expand All @@ -47,10 +48,12 @@ public AddCommand parse(String args) throws ParseException {
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
Username username = ParserUtil.parseUsername(argMultimap.getValue(PREFIX_USERNAME)
.orElseGet(() -> name.fullName));
Set<Project> projectList = ParserUtil.parseProjects(argMultimap.getAllValues(PREFIX_PROJECT));
Salary salary = ParserUtil.parseSalary(argMultimap.getValue(PREFIX_SALARY).get());

Person person = new Person(name, phone, email, address, salary, new Username(name.fullName),
Person person = new Person(name, phone, email, address, salary, username,
new Password("Pa55w0rd"), projectList);

return new AddCommand(person);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class CliSyntax {
public static final Prefix PREFIX_SALARY = new Prefix("-s");
public static final Prefix PREFIX_ADDRESS = new Prefix("-a");
public static final Prefix PREFIX_PROJECT = new Prefix("-t");
public static final Prefix PREFIX_USERNAME = new Prefix("-u");

/* Prefix for assignment*/
public static final Prefix PREFIX_ASSIGNMENT_NAME = new Prefix("-an");
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
import seedu.address.model.person.Salary;
import seedu.address.model.person.Username;
import seedu.address.model.project.Project;
import seedu.address.model.project.ProjectName;

Expand Down Expand Up @@ -120,6 +121,22 @@ public static Email parseEmail(String email) throws ParseException {
return new Email(trimmedEmail);
}

/**
* Parses a {@code String username} into a {@code Username}.
* Leading and trailing whitespaces will be trimmed.
* Does not verify if the username is unqiue in the system.
*
* @throws ParseException if the given {@code username} is invalid.
*/
public static Username parseUsername(String username) throws ParseException {
requireNonNull(username);
String trimmedName = username.trim();
if (!Username.isValidUsername(username) || username.equals("Admin")) {
throw new ParseException(Username.MESSAGE_USERNAME_CONSTRAINTS);
}
return new Username(username);
}

/**
* Parses a {@code String projectName} into an {@code ProjectName}.
* Leading and trailing whitespaces will be trimmed.
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ public interface Model {
*/
void addPerson(Person person);

/**
* Checks if the given username is already in the addressbook, for the current version.
* You can choose to ignore a person's username when doing so (i.e. you'er planning to update that person)
* @param username the Username to check against
* @param ignore The person to ignore, if any. null for no one.
* @return True if it's already in the address book, false otherwise
*/
boolean alreadyContainsUsername(String username, Person ignore);

/**
* Replaces the given person {@code target} with {@code editedPerson}.
* {@code target} must exist in the address book.
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.util.List;
import java.util.function.Predicate;
import java.util.logging.Logger;

Expand All @@ -14,6 +15,7 @@
import seedu.address.commons.events.model.AddressBookChangedEvent;
import seedu.address.commons.events.model.ArchivedListChangedEvent;
import seedu.address.commons.events.model.AssignmentListChangedEvent;
import seedu.address.commons.exceptions.IllegalUsernameException;
import seedu.address.model.leaveapplication.LeaveApplicationWithEmployee;
import seedu.address.model.person.Person;
import seedu.address.model.person.User;
Expand Down Expand Up @@ -108,15 +110,33 @@ public void deletePerson(Person target) {

@Override
public void addPerson(Person person) {
if (alreadyContainsUsername(person.getUsername().username, null)) {
throw new IllegalUsernameException(person.getUsername().username);
}
versionedAddressBook.addPerson(person);
updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
indicateAddressBookChanged();
}

@Override
public boolean alreadyContainsUsername(String newUsername, Person ignore) {
List<Person> currentPeople = versionedAddressBook.getPersonList();
for (Person p : currentPeople) {
if (!p.isSamePerson(ignore) && p.getUsername().username.equals(newUsername)) {
return true;
}
}
return false;
}

@Override
public void updatePerson(Person target, Person editedPerson) {
requireAllNonNull(target, editedPerson);

if (alreadyContainsUsername(editedPerson.getUsername().username, target)) {
throw new IllegalUsernameException(editedPerson.getUsername().username);
}

versionedAddressBook.updatePerson(target, editedPerson);

//Update logged in user
Expand Down
1 change: 1 addition & 0 deletions src/main/java/seedu/address/model/person/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ public boolean isSamePerson(Person otherPerson) {

return otherPerson != null
&& otherPerson.getName().equals(getName())
&& otherPerson.getUsername().equals(getUsername())
&& (otherPerson.getPhone().equals(getPhone()) || otherPerson.getEmail().equals(getEmail()));
}

Expand Down
5 changes: 4 additions & 1 deletion src/main/java/seedu/address/model/person/Username.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public class Username {

public static final String MESSAGE_USERNAME_CONSTRAINTS =
"Username should only contain alphanumeric characters and spaces, the first character cannot be a "
+ "whitespace, and it should not be blank";
+ "whitespace, it should not be blank, it should be unique among everyone in the system and it cannot be "
+ "\"Admin\"";

/*
* The first character of the username must not be a whitespace,
Expand All @@ -34,6 +35,8 @@ public Username(String name) {

/**
* Returns true if a given string is a valid username.
* Note: Does not verify constraint for unique among everyone in the system, neither does it check for Admin (if
* it did, the Admin user couldn't be assigned a Username)
*/
public static boolean isValidUsername(String test) {
return test.matches(NAME_VALIDATION_REGEX);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ public void addPerson(Person person) {
throw new AssertionError("This method should not be called.");
}

@Override
public boolean alreadyContainsUsername(String username, Person ignore) {
throw new AssertionError("This method should not be called.");
}

@Override
public void resetData(ReadOnlyAddressBook newData) {
throw new AssertionError("This method should not be called.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
*/
public class AddCommandIntegrationTest {

public static final String UNIQUE_USERNAME = "John Brown";

private Model model;
private CommandHistory commandHistory = new CommandHistory();

Expand All @@ -34,7 +36,7 @@ public void setUp() {

@Test
public void execute_newPerson_success() {
Person validPerson = new PersonBuilder().build();
Person validPerson = new PersonBuilder().withUsername(UNIQUE_USERNAME).build();

Model expectedModel = new ModelManager(model.getAddressBook(), model.getAssignmentList(),
model.getArchiveList(), new UserPrefs());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ public void addPerson(Person person) {
throw new AssertionError("This method should not be called.");
}

@Override
public boolean alreadyContainsUsername(String username, Person ignore) {
return false;
}

@Override
public void resetData(ReadOnlyAddressBook newData) {
throw new AssertionError("This method should not be called.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_USERNAME;

import java.time.LocalDate;
import java.util.ArrayList;
Expand Down Expand Up @@ -75,6 +76,8 @@ public class CommandTestUtil {
public static final String PROJECT_DESC_FALCON = " " + PREFIX_PROJECT + " " + VALID_PROJECT_FALCON;
public static final String SALARY_DESC_AMY = " " + PREFIX_SALARY + " " + VALID_SALARY_AMY;
public static final String SALARY_DESC_BOB = " " + PREFIX_SALARY + " " + VALID_SALARY_BOB;
public static final String USERNAME_DESC_AMY = " " + PREFIX_USERNAME + " " + VALID_USERNAME_AMY;
public static final String USERNAME_DESC_BOB = " " + PREFIX_USERNAME + " " + VALID_USERNAME_BOB;
public static final String NAME_ASSIGNMENT_DESC_OASIS = " " + PREFIX_ASSIGNMENT_NAME + " " + VALID_PROJECT_OASIS;
public static final String AUTHOR_ASSIGNMENT_DESC_OASIS = " " + PREFIX_AUTHOR + " " + VALID_NAME_AMY;
public static final String ASSIGNMENT_DESC_OASIS =
Expand Down
34 changes: 29 additions & 5 deletions src/test/java/seedu/address/logic/commands/EditCommandTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,31 +117,55 @@ public void execute_filteredList_success() {

Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), model.getAssignmentList(),
model.getArchiveList(), new UserPrefs());
expectedModel.updatePerson(model.getFilteredPersonList().get(0), editedPerson);
expectedModel.updatePerson(model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased()), editedPerson);
expectedModel.commitAddressBook();

assertCommandSuccess(editCommand, model, commandHistory, expectedMessage, expectedModel);
}

@Test
public void execute_duplicatePersonUnfilteredList_failure() {
public void execute_duplicatePersonUnfilteredList_success() {
Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(firstPerson).build();
EditCommand editCommand = new EditCommand(INDEX_SECOND_PERSON, descriptor);

assertCommandFailure(editCommand, model, commandHistory, EditCommand.MESSAGE_DUPLICATE_PERSON);
Person secondPerson = model.getFilteredPersonList().get(INDEX_SECOND_PERSON.getZeroBased());
Person editedPerson = new PersonBuilder(firstPerson).withUsername(secondPerson.getUsername().username)
.withPassword(secondPerson.getPassword().password)
.withLeaveApplications(secondPerson.getLeaveApplications()).build();

String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedPerson);

Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), model.getAssignmentList(),
model.getArchiveList(), new UserPrefs());
expectedModel.updatePerson(model.getFilteredPersonList().get(INDEX_SECOND_PERSON.getZeroBased()), editedPerson);
expectedModel.commitAddressBook();

assertCommandSuccess(editCommand, model, commandHistory, expectedMessage, expectedModel);
}

@Test
public void execute_duplicatePersonFilteredList_failure() {
public void execute_duplicatePersonFilteredList_success() {
showPersonAtIndex(model, INDEX_FIRST_PERSON);

// edit person in filtered list into a duplicate in address book
Person personInList = model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());
EditCommand editCommand = new EditCommand(INDEX_FIRST_PERSON,
new EditPersonDescriptorBuilder(personInList).build());

assertCommandFailure(editCommand, model, commandHistory, EditCommand.MESSAGE_DUPLICATE_PERSON);
Person firstPerson = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());
Person editedPerson = new PersonBuilder(personInList).withUsername(firstPerson.getUsername().username)
.withPassword(firstPerson.getPassword().password)
.withLeaveApplications(firstPerson.getLeaveApplications()).build();

String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedPerson);

Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), model.getAssignmentList(),
model.getArchiveList(), new UserPrefs());
expectedModel.updatePerson(model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased()), editedPerson);
expectedModel.commitAddressBook();

assertCommandSuccess(editCommand, model, commandHistory, expectedMessage, expectedModel);
}

@Test
Expand Down
2 changes: 2 additions & 0 deletions src/test/java/seedu/address/testutil/PersonUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_USERNAME;

import java.util.Set;

Expand Down Expand Up @@ -36,6 +37,7 @@ public static String getPersonDetails(Person person) {
sb.append(PREFIX_EMAIL + person.getEmail().value + " ");
sb.append(PREFIX_ADDRESS + person.getAddress().value + " ");
sb.append(PREFIX_SALARY + person.getSalary().value + " ");
sb.append(PREFIX_USERNAME + person.getUsername().username + " ");
person.getProjects().stream().forEach(
s -> sb.append(PREFIX_PROJECT + s.getProjectName() + " ")
);
Expand Down
Loading

0 comments on commit 70c2ea9

Please sign in to comment.