diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 7fac96035b5..05314c73097 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -33,7 +33,12 @@ import seedu.address.model.contact.Email; import seedu.address.model.contact.Id; import seedu.address.model.contact.Name; +import seedu.address.model.contact.Organization; import seedu.address.model.contact.Phone; +import seedu.address.model.contact.Position; +import seedu.address.model.contact.Recruiter; +import seedu.address.model.contact.Status; +import seedu.address.model.contact.Type; import seedu.address.model.contact.Url; import seedu.address.model.tag.Tag; @@ -54,25 +59,53 @@ public class EditCommand extends Command { AutocompleteDataSet.anyNumberOf(FLAG_TAG) ); - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the contact identified " - + "by the index number used in the displayed contact list. " - + "Existing values will be overwritten by the input values.\n" - + "Parameters: INDEX (must be a positive integer) " + public static final String MESSAGE_ORGANIZATION_USAGE = "Edits an organization.\n" + + "Parameters: INDEX/ID " + "[" + FLAG_NAME + " NAME] " + + "[" + FLAG_ID + " ID] " + "[" + FLAG_PHONE + " PHONE] " + "[" + FLAG_EMAIL + " EMAIL] " + + "[" + FLAG_URL + " URL] " + "[" + FLAG_ADDRESS + " ADDRESS] " + + "[" + FLAG_STATUS + " STATUS] " + + "[" + FLAG_POSITION + " POSITION] " + "[" + FLAG_TAG + " TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + FLAG_PHONE + " 91234567 " - + FLAG_EMAIL + " johndoe@example.com"; + + FLAG_STATUS + " Applied"; + + public static final String MESSAGE_RECRUITER_USAGE = "Edits a recruiter.\n" + + "Parameters: INDEX/ID " + + "[" + FLAG_NAME + " NAME] " + + "[" + FLAG_ID + " ID] " + + "[" + FLAG_PHONE + " PHONE] " + + "[" + FLAG_EMAIL + " EMAIL] " + + "[" + FLAG_URL + " URL] " + + "[" + FLAG_ADDRESS + " ADDRESS] " + + "[" + FLAG_ORGANIZATION_ID + " OID] " + + "[" + FLAG_TAG + " TAG]...\n" + + "Example: " + COMMAND_WORD + " 1 " + + FLAG_PHONE + " 91234567 " + + FLAG_EMAIL + " rexrecruiter@example.com"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Edits the details of the contact of the class type Organization or Recruiter," + + " identified by its index in the displayed contact list or its id." + + " Note that existing values will be overwritten by the input values." + + " The input format varies depending on the class:\n\n" + + MESSAGE_ORGANIZATION_USAGE + "\n\n" + + MESSAGE_RECRUITER_USAGE; public static final String MESSAGE_EDIT_CONTACT_SUCCESS = "Edited Contact: %1$s"; public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; public static final String MESSAGE_DUPLICATE_CONTACT = "This contact already exists in the address book."; + public static final String MESSAGE_INVALID_ORGANIZATION = + "The organization id you supplied does not match any organization in the address book."; - private final Index index; - private final EditContactDescriptor editContactDescriptor; + private Index index; + + private Id targetId = null; + private EditContactDescriptor editContactDescriptor; /** * @param index of the contact in the filtered contact list to edit @@ -86,9 +119,23 @@ public EditCommand(Index index, EditContactDescriptor editContactDescriptor) { this.editContactDescriptor = new EditContactDescriptor(editContactDescriptor); } + /** + * @param targetId of the contact to be editted + */ + public EditCommand(Id targetId, EditContactDescriptor editContactDescriptor) { + this.targetId = targetId; + this.editContactDescriptor = new EditContactDescriptor(editContactDescriptor); + } + + @Override public CommandResult execute(Model model) throws CommandException { requireNonNull(model); + if (this.targetId != null) { + Contact contactToEdit = model.getContactById(targetId); + return getCommandResult(model, contactToEdit); + } + List lastShownList = model.getFilteredContactList(); if (index.getZeroBased() >= lastShownList.size()) { @@ -96,22 +143,30 @@ public CommandResult execute(Model model) throws CommandException { } Contact contactToEdit = lastShownList.get(index.getZeroBased()); - Contact editedContact = createEditedContact(contactToEdit, editContactDescriptor); + return getCommandResult(model, contactToEdit); + } + + public CommandResult getCommandResult(Model model, Contact contactToEdit) throws CommandException { + Contact editedContact = createEditedContact(model, contactToEdit, editContactDescriptor); if (!contactToEdit.isSameContact(editedContact) && model.hasContact(editedContact)) { throw new CommandException(MESSAGE_DUPLICATE_CONTACT); } - model.setContact(contactToEdit, editedContact); model.updateFilteredContactList(PREDICATE_SHOW_ALL_CONTACTS); return new CommandResult(String.format(MESSAGE_EDIT_CONTACT_SUCCESS, Messages.format(editedContact))); } + + + + /** * Creates and returns a {@code Contact} with the details of {@code contactToEdit} * edited with {@code editContactDescriptor}. */ - private static Contact createEditedContact(Contact contactToEdit, EditContactDescriptor editContactDescriptor) { + private static Contact createEditedContact(Model model, Contact contactToEdit, + EditContactDescriptor editContactDescriptor) throws CommandException { assert contactToEdit != null; Name updatedName = editContactDescriptor.getName() @@ -129,6 +184,32 @@ private static Contact createEditedContact(Contact contactToEdit, EditContactDes Set updatedTags = editContactDescriptor.getTags() .orElse(contactToEdit.getTags()); + + if (contactToEdit.getType() == Type.ORGANIZATION) { + Status updatedStatus = editContactDescriptor.getStatus() + .orElse(((Organization) contactToEdit).getStatus().orElse(null)); + + Position updatedPosition = editContactDescriptor.getPosition() + .orElse(((Organization) contactToEdit).getPosition().orElse(null)); + return new Organization(updatedName, updatedId, updatedPhone, updatedEmail, updatedUrl, + updatedAddress, updatedTags, updatedStatus, updatedPosition, null); + } else if (contactToEdit.getType() == Type.RECRUITER) { + Optional updatedOid = editContactDescriptor + .getOrganizationId() + .or(() -> ((Recruiter) contactToEdit).getOrganizationId()); + + Organization updatedOrganization = (Organization) updatedOid.map(model::getContactById) + .filter(c -> c.getType() == Type.ORGANIZATION) + .orElse(null); + + if (updatedOid.isPresent() && updatedOrganization == null) { + throw new CommandException(MESSAGE_INVALID_ORGANIZATION); + } + + return new Recruiter(updatedName, updatedId, updatedPhone, updatedEmail, updatedUrl, + updatedAddress, updatedTags, updatedOrganization); + } + return new Contact(updatedName, updatedId, updatedPhone, updatedEmail, updatedUrl, updatedAddress, updatedTags); } @@ -168,6 +249,10 @@ public static class EditContactDescriptor { private Url url; private Address address; private Set tags; + private Status status; + private Position position; + + private Id oid; public EditContactDescriptor() {} @@ -183,19 +268,30 @@ public EditContactDescriptor(EditContactDescriptor toCopy) { setUrl(toCopy.url); setAddress(toCopy.address); setTags(toCopy.tags); + setStatus(toCopy.status); + setPosition(toCopy.position); + setOid(toCopy.oid); } /** * Returns true if at least one field is edited. */ public boolean isAnyFieldEdited() { - return CollectionUtil.isAnyNonNull(name, phone, email, address, tags); + return CollectionUtil.isAnyNonNull(name, phone, email, address, tags, id, url, status, position, oid); } public void setName(Name name) { this.name = name; } + public Optional getOrganizationId() { + return Optional.ofNullable(oid); + } + + public void setOid(Id id) { + this.oid = id; + } + public Optional getName() { return Optional.ofNullable(name); } @@ -236,6 +332,22 @@ public void setAddress(Address address) { this.address = address; } + public void setStatus(Status status) { + this.status = status; + } + + public void setPosition(Position position) { + this.position = position; + } + + public Optional getStatus() { + return Optional.ofNullable(status); + } + + public Optional getPosition() { + return Optional.ofNullable(position); + } + public Optional
getAddress() { return Optional.ofNullable(address); } @@ -284,6 +396,9 @@ public String toString() { .add("email", email) .add("address", address) .add("tags", tags) + .add("url", url) + .add("status", status) + .add("position", position) .toString(); } } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 787509711cf..b40987e6269 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -4,9 +4,14 @@ import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.parser.CliSyntax.FLAG_ADDRESS; import static seedu.address.logic.parser.CliSyntax.FLAG_EMAIL; +import static seedu.address.logic.parser.CliSyntax.FLAG_ID; import static seedu.address.logic.parser.CliSyntax.FLAG_NAME; +import static seedu.address.logic.parser.CliSyntax.FLAG_ORGANIZATION_ID; import static seedu.address.logic.parser.CliSyntax.FLAG_PHONE; +import static seedu.address.logic.parser.CliSyntax.FLAG_POSITION; +import static seedu.address.logic.parser.CliSyntax.FLAG_STATUS; import static seedu.address.logic.parser.CliSyntax.FLAG_TAG; +import static seedu.address.logic.parser.CliSyntax.FLAG_URL; import java.util.Collection; import java.util.Collections; @@ -17,8 +22,13 @@ import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.EditCommand.EditContactDescriptor; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.contact.Id; import seedu.address.model.tag.Tag; + + + + /** * Parses input arguments and creates a new EditCommand object */ @@ -36,14 +46,23 @@ public EditCommand parse(String args) throws ParseException { EditCommand.AUTOCOMPLETE_SUPPLIER.getAllPossibleFlags().toArray(Flag[]::new)); Index index; + Id targetId; try { - index = ParserUtil.parseIndex(argMultimap.getPreamble()); + String preambleStr = argMultimap.getPreamble(); + if (preambleStr.matches("^[A-Za-z].*")) { + targetId = ParserUtil.parseId(preambleStr); + index = null; + } else { + index = ParserUtil.parseIndex(preambleStr); + targetId = null; + } } catch (ParseException pe) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe); } - argMultimap.verifyNoDuplicateFlagsFor(FLAG_NAME, FLAG_PHONE, FLAG_EMAIL, FLAG_ADDRESS); + argMultimap.verifyNoDuplicateFlagsFor(FLAG_NAME, FLAG_PHONE, FLAG_EMAIL, + FLAG_ADDRESS, FLAG_URL, FLAG_ID, FLAG_STATUS, FLAG_POSITION, FLAG_ORGANIZATION_ID); EditContactDescriptor editContactDescriptor = new EditContactDescriptor(); @@ -59,15 +78,39 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(FLAG_ADDRESS).isPresent()) { editContactDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(FLAG_ADDRESS).get())); } + if (argMultimap.getValue(FLAG_URL).isPresent()) { + editContactDescriptor.setUrl(ParserUtil.parseUrl(argMultimap.getValue(FLAG_URL).get())); + } + if (argMultimap.getValue(FLAG_ID).isPresent()) { + editContactDescriptor.setId(ParserUtil.parseId(argMultimap.getValue(FLAG_ID).get())); + } + if (argMultimap.getValue(FLAG_STATUS).isPresent()) { + editContactDescriptor.setStatus(ParserUtil.parseStatus(argMultimap.getValue(FLAG_STATUS).get())); + } + if (argMultimap.getValue(FLAG_POSITION).isPresent()) { + editContactDescriptor.setPosition(ParserUtil.parsePosition(argMultimap.getValue(FLAG_POSITION).get())); + } + if (argMultimap.getValue(FLAG_ORGANIZATION_ID).isPresent()) { + editContactDescriptor.setOid(ParserUtil.parseId(argMultimap.getValue(FLAG_ORGANIZATION_ID).get())); + } parseTagsForEdit(argMultimap.getAllValues(FLAG_TAG)).ifPresent(editContactDescriptor::setTags); if (!editContactDescriptor.isAnyFieldEdited()) { throw new ParseException(EditCommand.MESSAGE_NOT_EDITED); } - return new EditCommand(index, editContactDescriptor); + if (targetId == null) { + return new EditCommand(index, editContactDescriptor); + + } else { + return new EditCommand(targetId, editContactDescriptor); + + } + } + + /** * Parses {@code Collection tags} into a {@code Set} if {@code tags} is non-empty. * If {@code tags} contain only one element which is an empty string, it will be parsed into a diff --git a/src/main/java/seedu/address/model/contact/Id.java b/src/main/java/seedu/address/model/contact/Id.java index 32e5cbc398b..bf24125899a 100644 --- a/src/main/java/seedu/address/model/contact/Id.java +++ b/src/main/java/seedu/address/model/contact/Id.java @@ -17,7 +17,7 @@ public class Id { * The first character of the id must not be a whitespace, * otherwise " " (a blank string) becomes a valid input. */ - public static final String VALIDATION_REGEX = "[a-zA-Z0-9]([_\\-]?[a-zA-Z0-9])*"; + public static final String VALIDATION_REGEX = "[a-zA-Z](([_\\-]?[a-zA-Z0-9])*)"; public final String value; @@ -36,7 +36,7 @@ public Id(String id) { * Constructs an autogenerated {@code Id}. */ public Id() { - value = UUID.randomUUID().toString(); + value = "i-" + UUID.randomUUID().toString(); } /** diff --git a/src/main/java/seedu/address/model/contact/Organization.java b/src/main/java/seedu/address/model/contact/Organization.java index 2e2c0686541..d51008e82c4 100644 --- a/src/main/java/seedu/address/model/contact/Organization.java +++ b/src/main/java/seedu/address/model/contact/Organization.java @@ -41,7 +41,8 @@ public Organization( super(name, id, phone, email, url, address, tags); this.status = Optional.ofNullable(status); this.position = Optional.ofNullable(position); - this.rids.addAll(rids); + // Todo: Likely to deprecate rids completely + // this.rids.addAll(rids); } @Override diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json index 9d30daa6ffd..fa051e251ca 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json @@ -1,13 +1,13 @@ { "persons": [ { "name": "Valid Person", - "id": "18dfa74c-2229-4f4f-99a5-336c25e6783e", + "id": "a8dfa74c-2229-4f4f-99a5-336c25e6783e", "phone": "9482424", "email": "hans@example.com", "address": "4th street" }, { "name": "Person With Invalid Phone Field", - "id" : "3a6e0af8-5092-47c0-baf7-18d6dc535823", + "id" : "ba6e0af8-5092-47c0-baf7-18d6dc535823", "phone": "948asdf2424", "email": "hans@example.com", "address": "4th street" diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json index 14fe678746f..eef86fe2360 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json @@ -1,7 +1,7 @@ { "persons": [ { "name": "Person with invalid name field: Ha!ns Mu@ster", - "id" : "3a6e0af8-5092-47c0-baf7-18d6dc535823", + "id" : "ca6e0af8-5092-47c0-baf7-18d6dc535823", "phone": "9482424", "email": "hans@example.com", "address": "4th street" diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json index bbb9a5b774a..e9e80a4efeb 100644 --- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json @@ -1,7 +1,7 @@ { "persons": [ { "name": "Alice Pauline", - "id": "18dfa74c-2229-4f4f-99a5-336c25e6783e", + "id": "a8dfa74c-2229-4f4f-99a5-336c25e6783e", "phone": "94351253", "email": "alice@example.com", "url": "www.google.com", @@ -9,7 +9,7 @@ "tags": [ "friends" ] }, { "name": "Alice Pauline 2", - "id": "18dfa74c-2229-4f4f-99a5-336c25e6783e", + "id": "a8dfa74c-2229-4f4f-99a5-336c25e6783e", "phone": "94351253", "email": "pauline@example.com", "url": "www.facebook.com", diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json index 1f5815d2d44..9ecd3d12b32 100644 --- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json @@ -1,7 +1,7 @@ { "persons": [ { "name": "Hans Muster", - "id": "18dfa74c-2229-4f4f-99a5-336c25e6783e", + "id": "a8dfa74c-2229-4f4f-99a5-336c25e6783e", "phone": "9482424", "email": "invalid@email!3e", "address": "4th street" diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 7e449576d0c..e8536aff1e1 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -29,8 +29,8 @@ public class CommandTestUtil { public static final String VALID_NAME_AMY = "Amy Bee"; public static final String VALID_NAME_BOB = "Bob Choo"; - public static final String VALID_ID_AMY = "3a6e0af8-5092-47c0-baf7-18d6dc535823"; - public static final String VALID_ID_BOB = "18dfa74c-2229-4f4f-99a5-336c25e6783e"; + public static final String VALID_ID_AMY = "ca6e0af8-5092-47c0-baf7-18d6dc535823"; + public static final String VALID_ID_BOB = "a8dfa74c-2229-4f4f-99a5-336c25e6783e"; public static final String VALID_PHONE_AMY = "11111111"; public static final String VALID_PHONE_BOB = "22222222"; public static final String VALID_EMAIL_AMY = "amy@example.com"; diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java index eb7988af28f..6ad052ed5a8 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -25,8 +25,10 @@ import seedu.address.model.ModelManager; import seedu.address.model.UserPrefs; import seedu.address.model.contact.Contact; +import seedu.address.model.contact.Recruiter; import seedu.address.testutil.ContactBuilder; import seedu.address.testutil.EditContactDescriptorBuilder; +import seedu.address.testutil.RecruiterBuilder; /** * Contains integration tests (interaction with the Model) and unit tests for EditCommand. @@ -55,8 +57,8 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() { Index indexLastContact = Index.fromOneBased(model.getFilteredContactList().size()); Contact lastContact = model.getFilteredContactList().get(indexLastContact.getZeroBased()); - ContactBuilder contactInList = new ContactBuilder(lastContact); - Contact editedContact = contactInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB) + RecruiterBuilder contactInList = new RecruiterBuilder((Recruiter) lastContact); + Recruiter editedContact = contactInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB) .withTags(VALID_TAG_HUSBAND).build(); EditContactDescriptor descriptor = new EditContactDescriptorBuilder().withName(VALID_NAME_BOB) diff --git a/src/test/java/seedu/address/logic/commands/EditContactDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditContactDescriptorTest.java index 9fe2bcc348e..27553b0582c 100644 --- a/src/test/java/seedu/address/logic/commands/EditContactDescriptorTest.java +++ b/src/test/java/seedu/address/logic/commands/EditContactDescriptorTest.java @@ -65,7 +65,11 @@ public void toStringMethod() { + editContactDescriptor.getPhone().orElse(null) + ", email=" + editContactDescriptor.getEmail().orElse(null) + ", address=" + editContactDescriptor.getAddress().orElse(null) + ", tags=" - + editContactDescriptor.getTags().orElse(null) + "}"; + + editContactDescriptor.getTags().orElse(null) + ", url=" + + editContactDescriptor.getUrl().orElse(null) + ", status=" + + editContactDescriptor.getStatus().orElse(null) + ", position=" + + editContactDescriptor.getPosition().orElse(null) + "}"; assertEquals(expected, editContactDescriptor.toString()); + } } diff --git a/src/test/java/seedu/address/storage/JsonAdaptedContactTest.java b/src/test/java/seedu/address/storage/JsonAdaptedContactTest.java index 2a7e3a1b745..2700b6a3dde 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedContactTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedContactTest.java @@ -42,7 +42,7 @@ public class JsonAdaptedContactTest { private static final String VALID_NAME = BENSON.getName().toString(); private static final String VALID_STATUS = ""; private static final String VALID_POSITION = ""; - private static final String VALID_ID = "78a36caf-6d42-4fd2-a017-7f6a92fa3155"; + private static final String VALID_ID = "f8a36caf-6d42-4fd2-a017-7f6a92fa3155"; private static final String VALID_PHONE = BENSON.getPhone().get().value; private static final String VALID_EMAIL = BENSON.getEmail().get().value; private static final String VALID_URL = BENSON.getUrl().get().value;