From af0ad07acf54e0eb5bfcff1b1612c2fbe15ba7d1 Mon Sep 17 00:00:00 2001 From: elena Date: Tue, 24 Feb 2026 22:04:25 +0000 Subject: [PATCH 01/24] Local changes before syncing with upstream --- course-info.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/course-info.yaml b/course-info.yaml index 38962d8..506c6f2 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -23,4 +23,4 @@ additional_files: - name: .git/FETCH_HEAD - name: docs/HOW_TO_SUBMIT.md - name: docs/PROJECT_IDEAS.md -yaml_version: 3 +yaml_version: 5 From 033693336a13b0b35006edb733c478373febcae1 Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 25 Feb 2026 18:08:20 +0000 Subject: [PATCH 02/24] fix: main class --- src/main/java/com/wcc/bootcamp/java/{Task.java => Main.java} | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename src/main/java/com/wcc/bootcamp/java/{Task.java => Main.java} (62%) diff --git a/src/main/java/com/wcc/bootcamp/java/Task.java b/src/main/java/com/wcc/bootcamp/java/Main.java similarity index 62% rename from src/main/java/com/wcc/bootcamp/java/Task.java rename to src/main/java/com/wcc/bootcamp/java/Main.java index a065737..69783ab 100644 --- a/src/main/java/com/wcc/bootcamp/java/Task.java +++ b/src/main/java/com/wcc/bootcamp/java/Main.java @@ -1,7 +1,9 @@ +package com.wcc.bootcamp.java; + public class Main { public static void main(String[] args) { String greetings = "Hello World"; - System.out.println(greeting); + System.out.println(greetings); } } From 0f418a68618c5a83ee51914f0221ea730d2ecee5 Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 25 Feb 2026 19:36:16 +0000 Subject: [PATCH 03/24] feat:declare Member class, create constructor, add getters. --- course-info.yaml | 1 + .../java/com/wcc/platform/model/Member.java | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java diff --git a/course-info.yaml b/course-info.yaml index 40e1a40..e7afefc 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -24,4 +24,5 @@ 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 yaml_version: 5 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java new file mode 100644 index 0000000..5ce5673 --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java @@ -0,0 +1,56 @@ +package com.wcc.platform.model; + +import java.time.LocalDate; +import java.util.List; + +public class Member { + private final String name; + private final String email; + private final String location; + private final List skills; + private final LocalDate joinDate; + + + public Member( + String name, + String email, + String location, + List skills, + LocalDate joinDate + ) { + this.name = name; + this.email = email; + this.location = location; + this.skills = skills; + this.joinDate = joinDate; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getLocation() { + return location; + } + + public List getSkills() { + return skills; + } + + public LocalDate getJoinDate() { + return joinDate; + } + + @Override + public String toString() { + return String.format("%s | %s | %s", name, email, lacation); + } +} + + + + From 15318bf0bbfe1ee07b8edd7b22fc315146c81f14 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 07:55:25 +0000 Subject: [PATCH 04/24] add member storage --- course-info.yaml | 1 + .../wcc/platform/model/MemberRepository.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java diff --git a/course-info.yaml b/course-info.yaml index e7afefc..5cd3a40 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -25,4 +25,5 @@ additional_files: - 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 yaml_version: 5 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java new file mode 100644 index 0000000..a429067 --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -0,0 +1,18 @@ +package com.wcc.platform.member; + +import java.util.ArrayList; +import java.util.List; +//repository is responsible for saving, retrieving data +public class MemberRepository { + + //create object + private final List members = new ArrayList<>(); + + public void add(Member member) { + members.add(member); + } + + public List findAll() { + return members; + } +} \ No newline at end of file From 1f8f6b299c09995eef9918e3ac4b4cb024993a7a Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 09:06:05 +0000 Subject: [PATCH 05/24] fix: package imports --- .../src/main/java/com/wcc/platform/Main.java | 31 ++++++++++++++++++- .../java/com/wcc/platform/model/Member.java | 2 +- .../wcc/platform/model/MemberRepository.java | 2 +- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index e9f54e3..080ff50 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -1,9 +1,38 @@ package com.wcc.platform; +import com.wcc.platform.model.Member; +import com.wcc.platform.model.MemberRepository; + +import java.time.LocalDate; +import java.util.List; +import java.util.Scanner; + + public class Main { + + private static final Scanner scanner = new Scanner(System.in); + private static final MemberRepository repository = new MemberRepository(); + + public static void main(String[] args) { - System.out.println("WCC Member Directory started..."); + + + System.out.println("Enter name: "); + String name = scanner.nextLine(); + + System.out.println("Enter email: "); + String email = scanner.nextLine(); + + Member member = new Member( + name, + email, + "Unknown", + List.of(), + LocalDate.now() + ); + repository.add(member); + System.out.println("Member added."); } } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java index 5ce5673..cfb7625 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java @@ -47,7 +47,7 @@ public LocalDate getJoinDate() { @Override public String toString() { - return String.format("%s | %s | %s", name, email, lacation); + return String.format("%s | %s | %s", name, email, location); } } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index a429067..ca09a9e 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -1,4 +1,4 @@ -package com.wcc.platform.member; +package com.wcc.platform.model; import java.util.ArrayList; import java.util.List; From 95a1d09edc49a054e70ee0696a18d4c4a3211872 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 09:09:01 +0000 Subject: [PATCH 06/24] add user via CLI --- .../olena/project-1/src/main/java/com/wcc/platform/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 080ff50..8728f19 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -10,7 +10,7 @@ public class Main { - +//CLI add User private static final Scanner scanner = new Scanner(System.in); private static final MemberRepository repository = new MemberRepository(); From 1eacf540751e1f1d6d3d3cfaa3ad2ac2c8f25acf Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 09:23:00 +0000 Subject: [PATCH 07/24] add view members method --- .../olena/project-1/src/main/java/com/wcc/platform/Main.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 8728f19..6fc0a48 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -33,6 +33,10 @@ public static void main(String[] args) { ); repository.add(member); System.out.println("Member added."); + viewMembers(); + } + public static void viewMembers() { + repository.findAll().forEach(member -> System.out.println(member)); } } From 11020bbce39745c1981f88cbf7f1ec101527ecd6 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 09:26:30 +0000 Subject: [PATCH 08/24] refactor lambda --- .../olena/project-1/src/main/java/com/wcc/platform/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 6fc0a48..3cb98e6 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -36,7 +36,7 @@ public static void main(String[] args) { viewMembers(); } public static void viewMembers() { - repository.findAll().forEach(member -> System.out.println(member)); + repository.findAll().forEach(System.out::println); } } From 4a4e56d24456bc038abf74255c1fb2121f5ccba1 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 09:47:55 +0000 Subject: [PATCH 09/24] add location input --- .../olena/project-1/src/main/java/com/wcc/platform/Main.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 3cb98e6..ead715d 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -24,10 +24,13 @@ public static void main(String[] args) { System.out.println("Enter email: "); String email = scanner.nextLine(); + System.out.println("Enter location: "); + String location = scanner.nextLine(); + Member member = new Member( name, email, - "Unknown", + location, List.of(), LocalDate.now() ); From 5638d18d3622c53a9a6b9d8043112fb9e38352e7 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 11:24:22 +0000 Subject: [PATCH 10/24] add: save members to CSV file --- participants/olena/project-1/members.csv | 9 ++++++++ .../src/main/java/com/wcc/platform/Main.java | 6 +++-- .../wcc/platform/model/MemberRepository.java | 22 ++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 participants/olena/project-1/members.csv diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv new file mode 100644 index 0000000..e206e44 --- /dev/null +++ b/participants/olena/project-1/members.csv @@ -0,0 +1,9 @@ +name,email,location,joinDate +In, kl, Dubai, 2026-02-26 +name,email,location,joinDate +Iv, h, London, 2026-02-26 +name,email,location,joinDate +д,д,д,2026-02-26 +name,email,location,joinDate +j,j\,j,2026-02-26 +name,email,location,joinDate%nz,z,z,2026-02-26 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index ead715d..8879568 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -4,18 +4,19 @@ import com.wcc.platform.model.Member; import com.wcc.platform.model.MemberRepository; +import java.io.IOException; import java.time.LocalDate; import java.util.List; import java.util.Scanner; -public class Main { +public class Main { //CLI add User private static final Scanner scanner = new Scanner(System.in); private static final MemberRepository repository = new MemberRepository(); - public static void main(String[] args) { + public static void main(String[] args) throws IOException { System.out.println("Enter name: "); @@ -35,6 +36,7 @@ public static void main(String[] args) { LocalDate.now() ); repository.add(member); + repository.saveToCsv("members.csv"); System.out.println("Member added."); viewMembers(); } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index ca09a9e..1c463b7 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -1,7 +1,10 @@ package com.wcc.platform.model; +import java.io.FileWriter; import java.util.ArrayList; import java.util.List; +import java.io.IOException; + //repository is responsible for saving, retrieving data public class MemberRepository { @@ -15,4 +18,21 @@ public void add(Member member) { public List findAll() { return members; } -} \ No newline at end of file + + public void saveToCsv(String filePath) throws IOException { + FileWriter writer = new FileWriter(filePath, true); + + writer.write("name,email,location,joinDate%n"); + + for (Member member : members) { + writer.write(String.format("%s,%s,%s,%s%n", + member.getName(), + member.getEmail(), + member.getLocation(), + member.getJoinDate() + )); + } + writer.close(); + } +} + From 04f041a48254bdf56d60cc78cb8c2a16162d22e0 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 11:42:56 +0000 Subject: [PATCH 11/24] add CSV header if file is empty --- participants/olena/project-1/members.csv | 10 ++-------- .../com/wcc/platform/model/MemberRepository.java | 12 ++++++++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index e206e44..3632a4e 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,9 +1,3 @@ name,email,location,joinDate -In, kl, Dubai, 2026-02-26 -name,email,location,joinDate -Iv, h, London, 2026-02-26 -name,email,location,joinDate -д,д,д,2026-02-26 -name,email,location,joinDate -j,j\,j,2026-02-26 -name,email,location,joinDate%nz,z,z,2026-02-26 +Alex,alex@yahoo.com,London,2026-02-26 +Nat,nat@gmail.com,Paris,2026-02-26 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index 1c463b7..a7af346 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -1,5 +1,6 @@ package com.wcc.platform.model; +import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.List; @@ -20,9 +21,16 @@ public List findAll() { } public void saveToCsv(String filePath) throws IOException { - FileWriter writer = new FileWriter(filePath, true); - writer.write("name,email,location,joinDate%n"); + File file = new File(filePath); + boolean fileExists = file.exists(); + boolean fileEmpty = !fileExists || file.length() == 0; + + FileWriter writer = new FileWriter(file, true); + + if(fileEmpty) { + writer.write(String.format("name,email,location,joinDate%n")); + } for (Member member : members) { writer.write(String.format("%s,%s,%s,%s%n", From cfe640b2a2f5ccf0be959f517ae76eda96df8891 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 12:44:30 +0000 Subject: [PATCH 12/24] add load members from Csv file --- participants/olena/project-1/members.csv | 9 +++++ .../src/main/java/com/wcc/platform/Main.java | 1 + .../java/com/wcc/platform/model/Member.java | 2 +- .../wcc/platform/model/MemberRepository.java | 36 +++++++++++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index 3632a4e..c07c5c8 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,3 +1,12 @@ name,email,location,joinDate Alex,alex@yahoo.com,London,2026-02-26 Nat,nat@gmail.com,Paris,2026-02-26 +Alex,alex@yahoo.com,London,2026-02-26 +Nat,nat@gmail.com,Paris,2026-02-26 +John,jo@yahoo.com,Spain,2026-02-26 +Alex,alex@yahoo.com,London,2026-02-26 +Nat,nat@gmail.com,Paris,2026-02-26 +Alex,alex@yahoo.com,London,2026-02-26 +Nat,nat@gmail.com,Paris,2026-02-26 +John,jo@yahoo.com,Spain,2026-02-26 +Noa,noa@gmail.com,Berlin,2026-02-26 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 8879568..7d966ee 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -17,6 +17,7 @@ public class Main { public static void main(String[] args) throws IOException { + repository.loadFromCsv("members.csv"); System.out.println("Enter name: "); diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java index cfb7625..62ae63c 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/Member.java @@ -47,7 +47,7 @@ public LocalDate getJoinDate() { @Override public String toString() { - return String.format("%s | %s | %s", name, email, location); + return String.format("%s %s %s", name, email, location); } } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index a7af346..30a76a4 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -1,10 +1,9 @@ package com.wcc.platform.model; -import java.io.File; -import java.io.FileWriter; +import java.io.*; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; -import java.io.IOException; //repository is responsible for saving, retrieving data public class MemberRepository { @@ -42,5 +41,36 @@ public void saveToCsv(String filePath) throws IOException { } writer.close(); } + + public void loadFromCsv(String filePath) throws IOException { + File file = new File(filePath); + if(!file.exists()){ + return; + } + + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + + String line; + + reader.readLine(); + + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + String name = parts[0].trim(); + String email = parts[1].trim(); + String location = parts[2].trim(); + LocalDate joinDate = LocalDate.parse(parts[3].trim()); + + Member member = new Member( + name, + email, + location, + List.of(), + joinDate + ); + members.add(member); + } + reader.close(); + } } From ee3519acf80c6456559cafb41a7f436107a1c949 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 12:55:51 +0000 Subject: [PATCH 13/24] refactor Rewrite CSV file on save instead of appending. Prevent duplicate entries and insure CSV file has a current state. --- participants/olena/project-1/members.csv | 14 ++------------ .../com/wcc/platform/model/MemberRepository.java | 2 +- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index c07c5c8..c73dd35 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,12 +1,2 @@ -name,email,location,joinDate -Alex,alex@yahoo.com,London,2026-02-26 -Nat,nat@gmail.com,Paris,2026-02-26 -Alex,alex@yahoo.com,London,2026-02-26 -Nat,nat@gmail.com,Paris,2026-02-26 -John,jo@yahoo.com,Spain,2026-02-26 -Alex,alex@yahoo.com,London,2026-02-26 -Nat,nat@gmail.com,Paris,2026-02-26 -Alex,alex@yahoo.com,London,2026-02-26 -Nat,nat@gmail.com,Paris,2026-02-26 -John,jo@yahoo.com,Spain,2026-02-26 -Noa,noa@gmail.com,Berlin,2026-02-26 +Ned,ned@gmail.com,Bristol,2026-02-26 +Alex,alex@gmail.com,London,2026-02-26 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index 30a76a4..5cff58d 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -25,7 +25,7 @@ public void saveToCsv(String filePath) throws IOException { boolean fileExists = file.exists(); boolean fileEmpty = !fileExists || file.length() == 0; - FileWriter writer = new FileWriter(file, true); + FileWriter writer = new FileWriter(file); if(fileEmpty) { writer.write(String.format("name,email,location,joinDate%n")); From 564e7c9be4a9ca0c7de09bbedd68c1baccffb298 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 26 Feb 2026 13:15:57 +0000 Subject: [PATCH 14/24] fix incorrect main class package reference --- course-info.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/course-info.yaml b/course-info.yaml index 5cd3a40..cdb26fc 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -26,4 +26,5 @@ additional_files: - 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 yaml_version: 5 From 0434aca493d695abcad39440f7119a1f77f280a7 Mon Sep 17 00:00:00 2001 From: elena Date: Fri, 27 Feb 2026 13:23:53 +0000 Subject: [PATCH 15/24] Add CsvMemberRepository with CSV persistence logic and convert MemberRepository into an interface. Main now depends on the abstraction (interface) instead of the concrete implementation. --- course-info.yaml | 1 + participants/olena/project-1/build.gradle | 3 + participants/olena/project-1/members.csv | 4 +- .../src/main/java/com/wcc/platform/Main.java | 4 +- .../platform/model/CsvMemberRepository.java | 75 +++++++++++++++++++ .../wcc/platform/model/MemberRepository.java | 75 ++----------------- 6 files changed, 90 insertions(+), 72 deletions(-) create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java diff --git a/course-info.yaml b/course-info.yaml index cdb26fc..d5df9f5 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -27,4 +27,5 @@ additional_files: - 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 yaml_version: 5 diff --git a/participants/olena/project-1/build.gradle b/participants/olena/project-1/build.gradle index 6948bdd..0da765f 100644 --- a/participants/olena/project-1/build.gradle +++ b/participants/olena/project-1/build.gradle @@ -12,4 +12,7 @@ repositories { application { mainClass = 'com.wcc.platform.Main' } +tasks.named('run') { + standardInput = System.in +} diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index c73dd35..f3a2a60 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,2 +1,2 @@ -Ned,ned@gmail.com,Bristol,2026-02-26 -Alex,alex@gmail.com,London,2026-02-26 +name,email,location,joinDate +Ned,ned@gmail.com,London,2026-02-27 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 7d966ee..acb27ea 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -3,6 +3,7 @@ import com.wcc.platform.model.Member; import com.wcc.platform.model.MemberRepository; +import com.wcc.platform.model.CsvMemberRepository; import java.io.IOException; import java.time.LocalDate; @@ -11,9 +12,8 @@ public class Main { -//CLI add User private static final Scanner scanner = new Scanner(System.in); - private static final MemberRepository repository = new MemberRepository(); + private static final MemberRepository repository = new CsvMemberRepository(); public static void main(String[] args) throws IOException { diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java new file mode 100644 index 0000000..c5a4dee --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java @@ -0,0 +1,75 @@ +package com.wcc.platform.model; + +import java.io.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + + +public class CsvMemberRepository implements MemberRepository { + + private final List members = new ArrayList<>(); + + public void add(Member member) { + members.add(member); + } + + public List findAll() { + return members; + } + + public void saveToCsv(String filePath) throws IOException { + + File file = new File(filePath); + boolean fileExists = file.exists(); + boolean fileEmpty = !fileExists || file.length() == 0; + + FileWriter writer = new FileWriter(file); + + if(fileEmpty) { + writer.write(String.format("name,email,location,joinDate%n")); + } + + for (Member member : members) { + writer.write(String.format("%s,%s,%s,%s%n", + member.getName(), + member.getEmail(), + member.getLocation(), + member.getJoinDate() + )); + } + writer.close(); + } + + public void loadFromCsv(String filePath) throws IOException { + File file = new File(filePath); + if(!file.exists()){ + return; + } + + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + + String line; + + reader.readLine(); + + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + String name = parts[0].trim(); + String email = parts[1].trim(); + String location = parts[2].trim(); + LocalDate joinDate = LocalDate.parse(parts[3].trim()); + + Member member = new Member( + name, + email, + location, + List.of(), + joinDate + ); + members.add(member); + } + reader.close(); + } +} + diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index 5cff58d..423929c 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -1,76 +1,15 @@ package com.wcc.platform.model; -import java.io.*; -import java.time.LocalDate; -import java.util.ArrayList; +import java.io.IOException; import java.util.List; -//repository is responsible for saving, retrieving data -public class MemberRepository { +public interface MemberRepository { - //create object - private final List members = new ArrayList<>(); + void add(Member member); - public void add(Member member) { - members.add(member); - } + List findAll(); - public List findAll() { - return members; - } - - public void saveToCsv(String filePath) throws IOException { - - File file = new File(filePath); - boolean fileExists = file.exists(); - boolean fileEmpty = !fileExists || file.length() == 0; - - FileWriter writer = new FileWriter(file); - - if(fileEmpty) { - writer.write(String.format("name,email,location,joinDate%n")); - } - - for (Member member : members) { - writer.write(String.format("%s,%s,%s,%s%n", - member.getName(), - member.getEmail(), - member.getLocation(), - member.getJoinDate() - )); - } - writer.close(); - } - - public void loadFromCsv(String filePath) throws IOException { - File file = new File(filePath); - if(!file.exists()){ - return; - } - - BufferedReader reader = new BufferedReader(new FileReader(filePath)); - - String line; - - reader.readLine(); - - while ((line = reader.readLine()) != null) { - String[] parts = line.split(","); - String name = parts[0].trim(); - String email = parts[1].trim(); - String location = parts[2].trim(); - LocalDate joinDate = LocalDate.parse(parts[3].trim()); - - Member member = new Member( - name, - email, - location, - List.of(), - joinDate - ); - members.add(member); - } - reader.close(); - } -} + void saveToCsv(String filePath) throws IOException; + void loadFromCsv(String filePath) throws IOException; +} \ No newline at end of file From e8a141fc65ecf4d14113801e012419f908b10fe9 Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 11 Mar 2026 14:53:07 +0000 Subject: [PATCH 16/24] header Csv file appears in console --- participants/olena/project-1/members.csv | 18 +++++++++-- .../src/main/java/com/wcc/platform/Main.java | 9 +++++- .../platform/model/CsvMemberRepository.java | 30 +++++++++---------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index f3a2a60..463f65e 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,2 +1,16 @@ -name,email,location,joinDate -Ned,ned@gmail.com,London,2026-02-27 +Max,max@gmail.com,London,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Alexandra,alex@gmail.com,Bath,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Alexandra,alex@gmail.com,Bath,2026-03-11 +Ana,ana@gmail.com,Kent,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Alexandra,alex@gmail.com,Bath,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Max,max@gmail.com,London,2026-03-11 +Alexandra,alex@gmail.com,Bath,2026-03-11 +Ana,ana@gmail.com,Kent,2026-03-11 +Kevin,kevin@gmail.com,Milan,2026-03-11 +Marta,marta@gmail.com,Brasil,2026-03-11 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index acb27ea..c0f0450 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -42,7 +42,14 @@ public static void main(String[] args) throws IOException { viewMembers(); } public static void viewMembers() { - repository.findAll().forEach(System.out::println); + + 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() + )); } } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java index c5a4dee..8f68661 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java @@ -24,21 +24,21 @@ public void saveToCsv(String filePath) throws IOException { boolean fileExists = file.exists(); boolean fileEmpty = !fileExists || file.length() == 0; - FileWriter writer = new FileWriter(file); - - if(fileEmpty) { - writer.write(String.format("name,email,location,joinDate%n")); - } - - for (Member member : members) { - writer.write(String.format("%s,%s,%s,%s%n", - member.getName(), - member.getEmail(), - member.getLocation(), - member.getJoinDate() - )); - } - writer.close(); + try(FileWriter writer = new FileWriter(file)) { + + if (fileEmpty) { + writer.write(String.format("name,email,location,joinDate%n")); + } + + for (Member member : members) { + writer.write(String.format("%s,%s,%s,%s%n", + member.getName(), + member.getEmail(), + member.getLocation(), + member.getJoinDate() + )); + } + } } public void loadFromCsv(String filePath) throws IOException { From 9a2e14547629872c86c60c75f88abcf7feac29ee Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 11 Mar 2026 15:22:29 +0000 Subject: [PATCH 17/24] prevent duplicate members by checking email before adding --- participants/olena/project-1/members.csv | 16 +--------------- .../wcc/platform/model/CsvMemberRepository.java | 6 ++++++ 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index 463f65e..ef96236 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,16 +1,2 @@ Max,max@gmail.com,London,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Alexandra,alex@gmail.com,Bath,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Alexandra,alex@gmail.com,Bath,2026-03-11 -Ana,ana@gmail.com,Kent,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Alexandra,alex@gmail.com,Bath,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Max,max@gmail.com,London,2026-03-11 -Alexandra,alex@gmail.com,Bath,2026-03-11 -Ana,ana@gmail.com,Kent,2026-03-11 -Kevin,kevin@gmail.com,Milan,2026-03-11 -Marta,marta@gmail.com,Brasil,2026-03-11 +Barath,barath@gmail.com,Bath,2026-03-11 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java index 8f68661..819a720 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java @@ -11,6 +11,12 @@ public class CsvMemberRepository implements MemberRepository { private final List members = new ArrayList<>(); public void add(Member member) { + boolean exists = members.stream().anyMatch(m->m.getEmail().equalsIgnoreCase(member.getEmail())); + + if(exists) { + System.out.println("Member already exists."); + return; + } members.add(member); } From 98c50fa1b81f6c40bdec8399b5e056fd29935ff5 Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 11 Mar 2026 15:51:18 +0000 Subject: [PATCH 18/24] add email validation when creating a member --- participants/olena/project-1/members.csv | 2 +- .../src/main/java/com/wcc/platform/Main.java | 13 +++++++++++-- .../java/com/wcc/platform/model/EmailValidator.java | 12 ++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index ef96236..c6dee71 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,2 +1,2 @@ -Max,max@gmail.com,London,2026-03-11 Barath,barath@gmail.com,Bath,2026-03-11 +Elena,elena@gmail.com,London,2026-03-11 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index c0f0450..d4fe0d8 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -4,6 +4,7 @@ import com.wcc.platform.model.Member; import com.wcc.platform.model.MemberRepository; import com.wcc.platform.model.CsvMemberRepository; +import com.wcc.platform.model.EmailValidator; import java.io.IOException; import java.time.LocalDate; @@ -23,8 +24,16 @@ public static void main(String[] args) throws IOException { System.out.println("Enter name: "); String name = scanner.nextLine(); - System.out.println("Enter email: "); - String email = scanner.nextLine(); + String email; + while(true) { + System.out.println("Enter email: "); + email = scanner.nextLine(); + + if(EmailValidator.isValid(email)) { + break; + } + System.out.println("Invalid email format. Please enter a valid email."); + } System.out.println("Enter location: "); String location = scanner.nextLine(); diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java new file mode 100644 index 0000000..e2b0662 --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java @@ -0,0 +1,12 @@ +package com.wcc.platform.model; + +import java.util.regex.Pattern; + +public class EmailValidator { + private static final Pattern EMAIL_PATTERN = + Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"); + + public static boolean isValid(String email) { + return EMAIL_PATTERN.matcher(email).matches(); + } +} \ No newline at end of file From c381dbb437664dd0c1de3c156ccd87ed3894f2f0 Mon Sep 17 00:00:00 2001 From: elena Date: Wed, 11 Mar 2026 16:06:18 +0000 Subject: [PATCH 19/24] refactor: extract email validation into EmailValidator utility class Moved validation logic from Main into a separate EmailValidator class. This improves separation of concerns and keeps Main focused on application flow. --- participants/olena/project-1/members.csv | 2 +- .../src/main/java/com/wcc/platform/Main.java | 13 ++------- .../wcc/platform/model/EmailValidator.java | 12 --------- .../platform/validation/EmailValidator.java | 27 +++++++++++++++++++ 4 files changed, 30 insertions(+), 24 deletions(-) delete mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/validation/EmailValidator.java diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index c6dee71..bc68ae3 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,2 +1,2 @@ -Barath,barath@gmail.com,Bath,2026-03-11 Elena,elena@gmail.com,London,2026-03-11 +Sarah,sara@gmail.com,London,2026-03-11 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index d4fe0d8..32c3bbe 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -4,7 +4,7 @@ import com.wcc.platform.model.Member; import com.wcc.platform.model.MemberRepository; import com.wcc.platform.model.CsvMemberRepository; -import com.wcc.platform.model.EmailValidator; +import com.wcc.platform.validation.EmailValidator; import java.io.IOException; import java.time.LocalDate; @@ -24,16 +24,7 @@ public static void main(String[] args) throws IOException { System.out.println("Enter name: "); String name = scanner.nextLine(); - String email; - while(true) { - System.out.println("Enter email: "); - email = scanner.nextLine(); - - if(EmailValidator.isValid(email)) { - break; - } - System.out.println("Invalid email format. Please enter a valid email."); - } + String email = EmailValidator.promptValidEmail(scanner); System.out.println("Enter location: "); String location = scanner.nextLine(); diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java deleted file mode 100644 index e2b0662..0000000 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/EmailValidator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.wcc.platform.model; - -import java.util.regex.Pattern; - -public class EmailValidator { - private static final Pattern EMAIL_PATTERN = - Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"); - - public static boolean isValid(String email) { - return EMAIL_PATTERN.matcher(email).matches(); - } -} \ No newline at end of file diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/validation/EmailValidator.java b/participants/olena/project-1/src/main/java/com/wcc/platform/validation/EmailValidator.java new file mode 100644 index 0000000..0beb423 --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/validation/EmailValidator.java @@ -0,0 +1,27 @@ +package com.wcc.platform.validation; + +import java.util.Scanner; +import java.util.regex.Pattern; + +public class EmailValidator { + private static final Pattern EMAIL_PATTERN = + Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"); + + public static boolean isValid(String email) { + return EMAIL_PATTERN.matcher(email).matches(); + } + + public static String promptValidEmail(Scanner scanner) { + + while (true) { + System.out.println("Enter email: "); + String email = scanner.nextLine(); + + if (isValid(email)) { + return email; + } + + System.out.println("Invalid email format. Please enter a valid email."); + } + } +} \ No newline at end of file From 9d1574edcb7f8584e504a338a1315a63418ae66d Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 12 Mar 2026 01:13:46 +0000 Subject: [PATCH 20/24] feat(cli): add CLI menu, search and sort commands - Add update members - Add delete members - Add search members by location - Add search members by skill - Add sort members by name - Add sort members by join date --- participants/olena/project-1/members.csv | 7 +- .../src/main/java/com/wcc/platform/Main.java | 70 +++--- .../java/com/wcc/platform/cli/MemberCli.java | 221 ++++++++++++++++++ .../platform/model/CsvMemberRepository.java | 107 +++++++-- .../wcc/platform/model/MemberRepository.java | 12 + 5 files changed, 361 insertions(+), 56 deletions(-) create mode 100644 participants/olena/project-1/src/main/java/com/wcc/platform/cli/MemberCli.java diff --git a/participants/olena/project-1/members.csv b/participants/olena/project-1/members.csv index bc68ae3..b1012ab 100644 --- a/participants/olena/project-1/members.csv +++ b/participants/olena/project-1/members.csv @@ -1,2 +1,5 @@ -Elena,elena@gmail.com,London,2026-03-11 -Sarah,sara@gmail.com,London,2026-03-11 +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 diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java index 32c3bbe..cc3ca08 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/Main.java @@ -1,6 +1,7 @@ package com.wcc.platform; +import com.wcc.platform.cli.MemberCli; import com.wcc.platform.model.Member; import com.wcc.platform.model.MemberRepository; import com.wcc.platform.model.CsvMemberRepository; @@ -14,42 +15,47 @@ public class Main { private static final Scanner scanner = new Scanner(System.in); - private static final MemberRepository repository = new CsvMemberRepository(); + public static void main(String[] args) throws IOException { + MemberRepository repository = new CsvMemberRepository(); 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() - )); + 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() +// )); +// } } diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/cli/MemberCli.java b/participants/olena/project-1/src/main/java/com/wcc/platform/cli/MemberCli.java new file mode 100644 index 0000000..429a3ec --- /dev/null +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/cli/MemberCli.java @@ -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 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 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 results = repository.findBySkill(skill); + + results.forEach(member -> + System.out.printf("%-15s %-25s %-15s%n", + member.getName(), + member.getEmail(), + member.getLocation() + ) + ); + } + + private void sortByName() { + + List results = repository.sortByName(); + + results.forEach(member -> + System.out.printf("%-15s %-25s %-15s%n", + member.getName(), + member.getEmail(), + member.getLocation() + ) + ); + } + + private void sortByJoinDate() { + + List results = repository.sortByJoinDate(); + + results.forEach(member -> + System.out.printf("%-15s %-25s %-15s%n", + member.getName(), + member.getEmail(), + member.getLocation() + ) + ); + } +} diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java index 819a720..2b420f7 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/CsvMemberRepository.java @@ -21,30 +21,91 @@ public void add(Member member) { } public List findAll() { - return members; + + return new ArrayList<>(members); + } + + public void deleteByEmail(String email) { + + members.removeIf(m -> m.getEmail().equalsIgnoreCase(email)); + } + + public void updateMember(String email, String newName, String newEmail, String newLocation, String newSkills) { + + for (int i = 0; i < members.size(); i++) { + + Member m = members.get(i); + + if (m.getEmail().equalsIgnoreCase(email)) { + + Member updatedMember = new Member( + newName, + newEmail, + newLocation, + m.getSkills(), + m.getJoinDate() + ); + + members.set(i, updatedMember); + + System.out.println("Member updated."); + + return; + } + } + + System.out.println("Member not found."); + } + + public List findByLocation(String location) { + + return members.stream() + .filter(m -> m.getLocation().equalsIgnoreCase(location)) + .toList(); + } + + public List findBySkill(String skill) { + + return members.stream() + .filter(m -> m.getSkills() + .stream() + .anyMatch(s -> s.equalsIgnoreCase(skill))) + .toList(); + } + + public List sortByName() { + + return members.stream() + .sorted((a, b) -> a.getName().compareToIgnoreCase(b.getName())) + .toList(); + } + + public List sortByJoinDate() { + + return members.stream() + .sorted((a, b) -> a.getJoinDate().compareTo(b.getJoinDate())) + .toList(); } public void saveToCsv(String filePath) throws IOException { - File file = new File(filePath); - boolean fileExists = file.exists(); - boolean fileEmpty = !fileExists || file.length() == 0; - - try(FileWriter writer = new FileWriter(file)) { - - if (fileEmpty) { - writer.write(String.format("name,email,location,joinDate%n")); - } - - for (Member member : members) { - writer.write(String.format("%s,%s,%s,%s%n", - member.getName(), - member.getEmail(), - member.getLocation(), - member.getJoinDate() - )); - } - } + try (FileWriter writer = new FileWriter(filePath)) { + + writer.write("name,email,location,skills,joinDate\n"); + + for (Member member : members) { + + String skills = String.join("|", member.getSkills()); + + writer.write(String.format("%s,%s,%s,%s,%s%n", + member.getName(), + member.getEmail(), + member.getLocation(), + skills, + member.getJoinDate() + )); + } + } } public void loadFromCsv(String filePath) throws IOException { @@ -64,13 +125,15 @@ public void loadFromCsv(String filePath) throws IOException { String name = parts[0].trim(); String email = parts[1].trim(); String location = parts[2].trim(); - LocalDate joinDate = LocalDate.parse(parts[3].trim()); + String skills = parts[3].trim(); + List skillList = List.of(skills.split("\\|")); + LocalDate joinDate = LocalDate.parse(parts[4].trim()); Member member = new Member( name, email, location, - List.of(), + skillList, joinDate ); members.add(member); diff --git a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java index 423929c..a608cab 100644 --- a/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java +++ b/participants/olena/project-1/src/main/java/com/wcc/platform/model/MemberRepository.java @@ -9,6 +9,18 @@ public interface MemberRepository { List findAll(); + void deleteByEmail(String email); + + void updateMember(String email, String newName, String newEmail, String newLocation, String newSkills); + + List findByLocation(String location); + + List findBySkill(String skill); + + List sortByName(); + + List sortByJoinDate(); + void saveToCsv(String filePath) throws IOException; void loadFromCsv(String filePath) throws IOException; From ad424cd065f31936ef65e54bf75bb301cf782584 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 12 Mar 2026 01:24:53 +0000 Subject: [PATCH 21/24] course-info.yaml auto updating on build command --- course-info.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/course-info.yaml b/course-info.yaml index d5df9f5..47b6b32 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -28,4 +28,4 @@ additional_files: - 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 -yaml_version: 5 +yaml_version: 5 \ No newline at end of file From ee8594ced90cec24428f9124a1c46bd2955527fc Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 12 Mar 2026 13:05:31 +0000 Subject: [PATCH 22/24] set JUnit test dependencies add email validation tests --- course-info.yaml | 3 +- participants/olena/project-1/build.gradle | 19 +++++++++++ .../com/wcc/platform/EmailValidatorTest.java | 34 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java diff --git a/course-info.yaml b/course-info.yaml index 47b6b32..a04da09 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -28,4 +28,5 @@ additional_files: - 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 -yaml_version: 5 \ No newline at end of file + - name: participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java +yaml_version: 5 diff --git a/participants/olena/project-1/build.gradle b/participants/olena/project-1/build.gradle index 0da765f..9c587e9 100644 --- a/participants/olena/project-1/build.gradle +++ b/participants/olena/project-1/build.gradle @@ -15,4 +15,23 @@ application { 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 + } +} diff --git a/participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java b/participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java new file mode 100644 index 0000000..789b11e --- /dev/null +++ b/participants/olena/project-1/src/test/java/com/wcc/platform/EmailValidatorTest.java @@ -0,0 +1,34 @@ +package com.wcc.platform; + +import com.wcc.platform.validation.EmailValidator; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class EmailValidatorTest { + + @Test + void shouldValidateCorrectEmail() { + //Arrange + String email = "test@gmail.com"; + + //Act + boolean result = EmailValidator.isValid(email); + + //Assert + assertTrue(result); + + } + + @Test + void shouldRejectInvalidEmail() { + //Arrange + String email = "email.com"; + + //Act + boolean result = EmailValidator.isValid(email); + + //Assert + assertFalse(result, "Email is invalid"); + } +} \ No newline at end of file From 7f7fac17614711643ab0801ab00c3b01314a5607 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 12 Mar 2026 23:38:43 +0000 Subject: [PATCH 23/24] update README.md --- course-info.yaml | 1 + participants/olena/project-1/README.md | 125 +++++++++++++------------ 2 files changed, 66 insertions(+), 60 deletions(-) diff --git a/course-info.yaml b/course-info.yaml index a04da09..c3de9c7 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -29,4 +29,5 @@ additional_files: - 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 + - name: participants/olena/project-1/CLAUDE.md yaml_version: 5 diff --git a/participants/olena/project-1/README.md b/participants/olena/project-1/README.md index dca1cfb..eb24175 100644 --- a/participants/olena/project-1/README.md +++ b/participants/olena/project-1/README.md @@ -1,87 +1,92 @@ -# Member Directory Command Line Tool +# Member Directory — CLI Tool -A simple command-line application built in Java to manage WCC member profiles. +A command-line application built in Java to manage WCC (Women Coding Community) member profiles. -This project allows users to add, view, update, delete, and search member profiles directly from the terminal. It focuses on practising core Java concepts such as Collections, File I/O, Object-Oriented Programming, and basic CRUD operations. - -The goal of this tool is to provide a clean and structured way to manage community member information such as name, email, location, skills, and interests. +Members are stored in a CSV file and loaded automatically on startup. The app supports adding, viewing, updating, deleting, searching, and sorting members from an interactive terminal menu. ## Features -### Main features: - -Add new member profiles - -View all member profiles - -Update existing member information - -Delete member profiles - -**Search members by:** - -- Skills - -- Location - -Store member data in a text/CSV file - -Load member data from a file on application start - -Display formatted member lists in the console - -Email format validation - -Export members to CSV - -Import members from CSV +- Add new member profiles (name, email, location, skills) +- View all members in a formatted table +- Update existing member information (looked up by email) +- Delete members by email +- Search members by location +- Search members by skill +- Sort members by name (A–Z) +- Sort members by join date +- Email format validation with re-prompt on invalid input +- Persist data to `members.csv` on every change +- Load data from `members.csv` on startup -**Sort members by:** +## Project Structure -- Name -- Join date +``` +src/ +├── main/java/com/wcc/platform/ +│ ├── Main.java # Entry point +│ ├── cli/ +│ │ └── MemberCli.java # Interactive menu loop +│ ├── model/ +│ │ ├── Member.java # Member data model +│ │ ├── MemberRepository.java # Repository interface +│ │ └── CsvMemberRepository.java # CSV-backed implementation +│ └── validation/ +│ └── EmailValidator.java # Email regex validation +└── test/java/com/wcc/platform/ + └── EmailValidatorTest.java # Unit tests +``` ## Technologies -``` - Java 17 -Command Line Interface (CLI) - ``` + +- Java 17 +- Gradle 9 (Groovy DSL) +- JUnit Jupiter 5.10.2 ## How to Run -Ensure Java 17 is selected as the SDK +Make sure Java 17 is set as the SDK. -Build the project -``` +**Build:** +```bash ./gradlew build ``` -Run the project -``` +**Run:** +```bash ./gradlew run ``` +**Test:** +```bash +./gradlew test +``` -### Using the Application - -Once started, the application will display a menu with options such as: - -Add Member - -View Members - -Update Member +## Using the Application -Delete Member +Once started, the application displays an interactive menu: -Search Member +``` +===== Member Directory ===== +1. Add Member +2. View Members +3. Update Member +4. Delete Member +5. Search by Location +6. Search by Skill +7. Sort by Name +8. Sort by Join Date +0. Exit +``` -Export to CSV +Follow the on-screen prompts. Member data is automatically saved to `members.csv` after any change. -Import from CSV +## Data Storage -Sort Members +Members are saved in `members.csv` in the working directory with the format: -Exit +``` +name,email,location,skills,joinDate +Jane Doe,jane@example.com,London,Java|Python,2024-01-15 +``` -Follow the on-screen prompts to perform actions. \ No newline at end of file +Skills are stored as pipe-separated values within the CSV field. From ecdcdd05739301aa38b565810619c8e49a8b6120 Mon Sep 17 00:00:00 2001 From: elena Date: Thu, 12 Mar 2026 23:54:50 +0000 Subject: [PATCH 24/24] add .gitignore to the project --- participants/olena/project-1/.gitignore | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 participants/olena/project-1/.gitignore diff --git a/participants/olena/project-1/.gitignore b/participants/olena/project-1/.gitignore new file mode 100644 index 0000000..36170e1 --- /dev/null +++ b/participants/olena/project-1/.gitignore @@ -0,0 +1,17 @@ +# Gradle +.gradle/ +build/ +gradle/caches/ +gradle/daemon/ +gradle/native/ +gradle/wrapper/dists/ + +# IntelliJ (beyond what .idea/.gitignore covers) +*.iml +out/ + +# macOS +.DS_Store + +# Claude Code +CLAUDE.md