Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
af0ad07
Local changes before syncing with upstream
OlenaReukova Feb 24, 2026
676b969
Merge remote-tracking branch 'upstream/main'
OlenaReukova Feb 24, 2026
0336933
fix: main class
OlenaReukova Feb 25, 2026
0f418a6
feat:declare Member class, create constructor, add getters.
OlenaReukova Feb 25, 2026
15318bf
add member storage
OlenaReukova Feb 26, 2026
1f8f6b2
fix: package imports
OlenaReukova Feb 26, 2026
95a1d09
add user via CLI
OlenaReukova Feb 26, 2026
1eacf54
add view members method
OlenaReukova Feb 26, 2026
11020bb
refactor lambda
OlenaReukova Feb 26, 2026
4a4e56d
add location input
OlenaReukova Feb 26, 2026
5638d18
add: save members to CSV file
OlenaReukova Feb 26, 2026
04f041a
add CSV header if file is empty
OlenaReukova Feb 26, 2026
cfe640b
add load members from Csv file
OlenaReukova Feb 26, 2026
ee3519a
refactor Rewrite CSV file on save instead of appending. Prevent dupli…
OlenaReukova Feb 26, 2026
564e7c9
fix incorrect main class package reference
OlenaReukova Feb 26, 2026
0434aca
Add CsvMemberRepository with CSV persistence logic and convert Member…
OlenaReukova Feb 27, 2026
e8a141f
header Csv file appears in console
OlenaReukova Mar 11, 2026
9a2e145
prevent duplicate members by checking email before adding
OlenaReukova Mar 11, 2026
98c50fa
add email validation when creating a member
OlenaReukova Mar 11, 2026
c381dbb
refactor: extract email validation into EmailValidator utility class
OlenaReukova Mar 11, 2026
9d1574e
feat(cli): add CLI menu, search and sort commands
OlenaReukova Mar 12, 2026
ad424cd
course-info.yaml auto updating on build command
OlenaReukova Mar 12, 2026
ee8594c
set JUnit test dependencies
OlenaReukova Mar 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions course-info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@ additional_files:
- name: docs/HOW_TO_SUBMIT.md
- name: docs/PROJECT_IDEAS.md
- name: docs/guides/numeric-literals-simplified.md
- name: participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java
- name: participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java
- name: src/main/java/com/wcc/bootcamp/java/Main.java
- name: participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java
- name: participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java
yaml_version: 5
22 changes: 22 additions & 0 deletions participants/olena/project-1/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,26 @@ repositories {
application {
mainClass = 'com.wcc.platform.Main'
}
tasks.named('run') {
standardInput = System.in
}
dependencies {

testImplementation platform('org.junit:junit-bom:5.10.2')
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

}

test {
useJUnitPlatform()

outputs.upToDateWhen { false }

testLogging {
events "passed", "failed", "skipped"
showStandardStreams = true
showExceptions = true
}
}

5 changes: 5 additions & 0 deletions participants/olena/project-1/members.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name,email,location,skills,joinDate
Tom,tom@gmail.com,UK,reading,2026-03-12
Ned,ned@gmail.com,UK,writing,2026-03-12
Sam,sam@gmail.com,UK,puzzles,2026-03-12
Tat,tat@gmail.com,France,n/a,2026-03-12
Original file line number Diff line number Diff line change
@@ -1,9 +1,61 @@
package com.wcc.platform;


public class Main {
public static void main(String[] args) {
System.out.println("WCC Member Directory started...");
import com.wcc.platform.cli.MemberCli;
import com.wcc.platform.model.Member;
import com.wcc.platform.model.MemberRepository;
import com.wcc.platform.model.CsvMemberRepository;
import com.wcc.platform.validation.EmailValidator;

import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Scanner;


public class Main {
private static final Scanner scanner = new Scanner(System.in);



public static void main(String[] args) throws IOException {
MemberRepository repository = new CsvMemberRepository();
repository.loadFromCsv("members.csv");
MemberCli cli = new MemberCli(repository);
cli.start();
}
// repository.loadFromCsv("members.csv");
//
//
// System.out.println("Enter name: ");
// String name = scanner.nextLine();
//
// String email = EmailValidator.promptValidEmail(scanner);
//
// System.out.println("Enter location: ");
// String location = scanner.nextLine();
//
// Member member = new Member(
// name,
// email,
// location,
// List.of(),
// LocalDate.now()
// );
// repository.add(member);
// repository.saveToCsv("members.csv");
// System.out.println("Member added.");
// viewMembers();
// }
// public static void viewMembers() {
//
// System.out.printf("%-15s %-25s %-15s%n", "Name", "Email", "Location");
// System.out.println("----------------------------------------------------------");
// repository.findAll().forEach(member -> System.out.printf("%-15s %-25s %-15s%n",
// member.getName(),
// member.getEmail(),
// member.getLocation()
// ));
// }
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
package com.wcc.platform.cli;

import com.wcc.platform.model.Member;
import com.wcc.platform.model.MemberRepository;
import com.wcc.platform.validation.EmailValidator;

import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Scanner;

public class MemberCli {
private final MemberRepository repository;
private final Scanner scanner;

public MemberCli(MemberRepository repository) {
this.repository = repository;
this.scanner = new Scanner(System.in);
}

public void start() throws IOException {
boolean running = true;
while(running) {
printMenu();
String choice = scanner.nextLine();
switch (choice) {
case "1":
addMember();
break;
case "2":
viewMembers();
break;
case "3":
updateMember();
break;
case "4":
deleteMember();
break;


case "5":
searchByLocation();
break;

case "6":
searchBySkill();
break;

case "7":
sortByName();
break;

case "8":
sortByJoinDate();
break;


case "0":
running = false;
break;

default:
System.out.println("Invalid option");
}
}
}

private void printMenu() {
System.out.println();
System.out.println("===== Member Directory =====");
System.out.println("1. Add Member");
System.out.println("2. View Members");
System.out.println("3. Update Member");
System.out.println("4. Delete Member");
System.out.println("5. Search by Location");
System.out.println("6. Search by Skill");
System.out.println("7. Sort by Name");
System.out.println("8. Sort by Join Date");
System.out.println("0. Exit");
System.out.println("Choose option: ");
}

private void addMember() throws IOException {

System.out.println("Enter name:");
String name = scanner.nextLine();

String email = EmailValidator.promptValidEmail(scanner);

System.out.println("Enter location:");
String location = scanner.nextLine();

System.out.println("Enter skills (comma separated):");
String skillsInput = scanner.nextLine();

List<String> skills = List.of(skillsInput.split(","));

Member member = new Member(
name,
email,
location,
skills,
LocalDate.now()
);

repository.add(member);
repository.saveToCsv("members.csv");

System.out.println("Member added.");
}

private void viewMembers() {

System.out.printf("%-15s %-25s %-15s %-20s%n", "Name", "Email", "Location", "Skills");
System.out.println("---------------------------------------------------------------------------------");

repository.findAll().forEach(member ->
System.out.printf("%-15s %-25s %-15s %-20s%n",
member.getName(),
member.getEmail(),
member.getLocation(),
String.join("|", member.getSkills())
)
);
}

private void updateMember() throws IOException {

System.out.println("Enter email of member to update:");
String email = scanner.nextLine();

System.out.println("Enter new name:");
String newName = scanner.nextLine();

System.out.println("Enter new email:");
String newEmail = EmailValidator.promptValidEmail(scanner);

System.out.println("Enter new location:");
String newLocation = scanner.nextLine();

System.out.println("Enter new skills:");
String newSkills = scanner.nextLine();

repository.updateMember(email, newName, newEmail, newLocation, newSkills);

repository.saveToCsv("members.csv");
}


private void deleteMember() throws IOException {

System.out.println("Enter email to delete:");

String email = scanner.nextLine();

repository.deleteByEmail(email);

repository.saveToCsv("members.csv");

System.out.println("Member deleted.");
}


private void searchByLocation() {

System.out.println("Enter location:");
String location = scanner.nextLine();

List<Member> results = repository.findByLocation(location);

results.forEach(member ->
System.out.printf("%-15s %-25s %-15s%n",
member.getName(),
member.getEmail(),
member.getLocation()
)
);
}

private void searchBySkill() {

System.out.println("Enter skill:");
String skill = scanner.nextLine();

List<Member> results = repository.findBySkill(skill);

results.forEach(member ->
System.out.printf("%-15s %-25s %-15s%n",
member.getName(),
member.getEmail(),
member.getLocation()
)
);
}

private void sortByName() {

List<Member> results = repository.sortByName();

results.forEach(member ->
System.out.printf("%-15s %-25s %-15s%n",
member.getName(),
member.getEmail(),
member.getLocation()
)
);
}

private void sortByJoinDate() {

List<Member> results = repository.sortByJoinDate();

results.forEach(member ->
System.out.printf("%-15s %-25s %-15s%n",
member.getName(),
member.getEmail(),
member.getLocation()
)
);
}
}
Loading