Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
53cd29f
feat: Mentorship Registration Step 1
dricazenck Jan 17, 2026
94a25ee
feat: Mentorship Registration Step 2
dricazenck Jan 17, 2026
bba95a2
feat: Mentorship Registration Step 3
dricazenck Jan 17, 2026
37fbb4d
feat: Mentorship Registration Step 4
dricazenck Jan 17, 2026
468ef95
feat: Mentorship Registration Step 5
dricazenck Jan 17, 2026
1f6b829
refactor: Mentorship Registration Step 6
dricazenck Jan 17, 2026
df00898
fix: unit tests and pmd checks
dricazenck Jan 17, 2026
056f91a
feat: Mentee Registration Step 7
dricazenck Jan 17, 2026
cee4d74
feat: Mentee Registration Step 7
dricazenck Jan 18, 2026
34920f4
feat: Add validation for Mentee and Mentor entities during create/upd…
dricazenck Jan 18, 2026
a259e67
feat: Enhance Mentee registration with duplicate filtering, validatio…
dricazenck Jan 18, 2026
0c79433
refactor: Rename MenteeRegistrationLimitExceededException to MenteeRe…
dricazenck Jan 18, 2026
3a5a9ef
refactor: Remove mentee application submission logic and related API …
dricazenck Jan 18, 2026
89c28a9
refactor: Update SQL queries in PostgresMentorshipCycleRepository to …
dricazenck Jan 18, 2026
1d7a74e
test: Integration tests for Mentee and MenteeApplication repositories
dricazenck Jan 18, 2026
67ff9a6
test: Disable DB2 integration tests temporarily due to database compa…
dricazenck Jan 18, 2026
890b1b5
test: Integration tests for Mentee and MenteeApplication repositories
dricazenck Jan 18, 2026
e8cbb33
refactor: Update controller tags to improve API categorization and cl…
dricazenck Jan 18, 2026
725a1c2
test: Rename and update Postgres mentorship repository integration test
dricazenck Jan 18, 2026
b782c96
refactor: Restructure mentee payload and introduce nested application…
dricazenck Jan 18, 2026
3e1bd68
feat: Add method to handle Mentee registration updates and improve se…
dricazenck Jan 18, 2026
ea04bcf
test: Fix test setup off mentee service
dricazenck Jan 18, 2026
4cd05c7
refactor: Replace exception type in MenteeWorkflowService and update …
dricazenck Jan 18, 2026
7c8e91a
feat: Create Crud for MatchRepository
dricazenck Jan 18, 2026
52ab54d
refactor: Address PMD rule violations
dricazenck Jan 18, 2026
194c8e9
feat: Enhance mentee and mentor creation to reuse existing members by…
dricazenck Jan 18, 2026
cb56f8a
refactor: Migrate CycleStatus from ENUM to table-based design
dricazenck Jan 19, 2026
7758cde
Merge branch 'main' of github.com:Women-Coding-Community/wcc-backend …
dricazenck Jan 19, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ src/main/resources/application-local.yml
/admin-wcc-app/.next/
/scripts/init-dev-env.sh
.vercel
/scripts/init-prod-env.sh
150 changes: 88 additions & 62 deletions scripts/init-local-env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -207,41 +207,55 @@ curl -s -X POST "${API_BASE}/platform/v1/mentees" \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Maria Silva",
"position": "Junior Software Engineer",
"email": "maria.silva@email.com",
"slackDisplayName": "@MariaS",
"country": {
"countryCode": "BR",
"countryName": "Brazil"
"mentee": {
"fullName": "Maria Silva",
"position": "Junior Software Engineer",
"email": "maria.silva@email.com",
"slackDisplayName": "@MariaS",
"country": {
"countryCode": "BR",
"countryName": "Brazil"
},
"city": "São Paulo",
"companyName": "TechBrasil",
"images": [],
"network": [
{
"type": "LINKEDIN",
"link": "https://www.linkedin.com/in/maria-silva/"
},
{
"type": "GITHUB",
"link": "https://github.com/mariasilva"
}
],
"profileStatus": "ACTIVE",
"skills": {
"yearsExperience": 2,
"areas": [ "BACKEND", "FULLSTACK" ],
"languages": [ "Java", "Javascript", "Python" ],
"mentorshipFocus": [
"Grow from beginner to mid-level",
"Grow beyond senior level"
]
},
"spokenLanguages": [ "Portuguese", "English", "Spanish" ],
"bio": "I am a Junior Software Engineer passionate about backend development and eager to learn best practices in software architecture and cloud technologies. I graduated in Computer Science and have been working with Java and Spring Boot for the past 2 years. I am looking for guidance to advance my career and become a senior engineer."
},
"city": "São Paulo",
"companyName": "TechBrasil",
"images": [],
"network": [
"mentorshipType": "LONG_TERM",
"cycleYear": 2026,
"applications": [
{
"type": "LINKEDIN",
"link": "https://www.linkedin.com/in/maria-silva/"
"menteeId": 1,
"mentorId": 1,
"priorityOrder": 1
},
{
"type": "GITHUB",
"link": "https://github.com/mariasilva"
"menteeId": 1,
"mentorId": 2,
"priorityOrder": 2
}
],
"profileStatus": "ACTIVE",
"skills": {
"yearsExperience": 2,
"areas": [ "BACKEND", "FULLSTACK" ],
"languages": [ "Java", "Javascript", "Python" ],
"mentorshipFocus": [
"Grow from beginner to mid-level",
"Grow beyond senior level"
]
},
"spokenLanguages": [ "Portuguese", "English", "Spanish" ],
"bio": "I am a Junior Software Engineer passionate about backend development and eager to learn best practices in software architecture and cloud technologies. I graduated in Computer Science and have been working with Java and Spring Boot for the past 2 years. I am looking for guidance to advance my career and become a senior engineer.",
"mentorshipType": "LONG_TERM",
"prevMentorshipType": "AD_HOC"
]
}'
echo " "
echo "✅ Mentee Maria added."
Expand All @@ -252,38 +266,50 @@ curl -s -X POST "${API_BASE}/platform/v1/mentees" \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Emma Schmidt",
"position": "Frontend Developer",
"email": "emma.schmidt@email.com",
"slackDisplayName": "@EmmaS",
"country": {
"countryCode": "DE",
"countryName": "Germany"
},
"city": "Berlin",
"companyName": "CloudTech GmbH",
"images": [],
"network": [
{
"type": "LINKEDIN",
"link": "https://www.linkedin.com/in/emma-schmidt/"
}
],
"profileStatus": "ACTIVE",
"skills": {
"yearsExperience": 3,
"areas": [ "FRONTEND", "DEVOPS" ],
"languages": [ "Javascript", "Python" ],
"mentorshipFocus": [
"Switch career to IT",
"Grow from beginner to mid-level"
]
},
"spokenLanguages": [ "German", "English" ],
"bio": "I am a Frontend Developer transitioning from traditional web development to cloud-native applications. I have experience with React and Vue.js, and I am currently learning AWS and Kubernetes. I am seeking mentorship to understand DevOps practices and how to build scalable frontend applications integrated with cloud services.",
"mentorshipType": "AD_HOC",
"prevMentorshipType": "AD_HOC"
}'
"mentee": {
"fullName": "Emma Schmidt",
"position": "Frontend Developer",
"email": "emma.schmidt@email.com",
"slackDisplayName": "@EmmaS",
"country": {
"countryCode": "DE",
"countryName": "Germany"
},
"city": "Berlin",
"companyName": "CloudTech GmbH",
"images": [],
"network": [
{
"type": "LINKEDIN",
"link": "https://www.linkedin.com/in/emma-schmidt/"
}
],
"profileStatus": "ACTIVE",
"skills": {
"yearsExperience": 3,
"areas": [ "FRONTEND", "DEVOPS" ],
"languages": [ "Javascript", "Python" ],
"mentorshipFocus": [
"Switch career to IT",
"Grow from beginner to mid-level"
]
},
"spokenLanguages": [ "German", "English" ],
"bio": "I am a Frontend Developer transitioning from traditional web development to cloud-native applications. I have experience with React and Vue.js, and I am currently learning AWS and Kubernetes. I am seeking mentorship to understand DevOps practices and how to build scalable frontend applications integrated with cloud services."
},
"mentorshipType": "LONG-TERM",
"cycleYear": 2026,
"applications": [
{
"mentorId": 2,
"priorityOrder": 1
},
{
"mentorId": 1,
"priorityOrder": 2
}
]
}'
echo " "
echo "✅ Mentee Emma added."
echo " "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
import static org.springframework.http.HttpStatus.NOT_FOUND;

import com.wcc.platform.domain.exceptions.ApplicationMenteeWorkflowException;
import com.wcc.platform.domain.exceptions.ContentNotFoundException;
import com.wcc.platform.domain.exceptions.DuplicatedItemException;
import com.wcc.platform.domain.exceptions.DuplicatedMemberException;
import com.wcc.platform.domain.exceptions.EmailSendException;
import com.wcc.platform.domain.exceptions.ErrorDetails;
import com.wcc.platform.domain.exceptions.InvalidProgramTypeException;
import com.wcc.platform.domain.exceptions.MemberNotFoundException;
import com.wcc.platform.domain.exceptions.MenteeNotSavedException;
import com.wcc.platform.domain.exceptions.MenteeRegistrationLimitException;
import com.wcc.platform.domain.exceptions.MentorshipCycleClosedException;
import com.wcc.platform.domain.exceptions.PlatformInternalException;
import com.wcc.platform.domain.exceptions.TemplateValidationException;
Expand Down Expand Up @@ -47,7 +50,8 @@ public ResponseEntity<ErrorDetails> handleNotFoundException(
@ExceptionHandler({
PlatformInternalException.class,
FileRepositoryException.class,
EmailSendException.class
EmailSendException.class,
MenteeNotSavedException.class
})
@ResponseStatus(INTERNAL_SERVER_ERROR)
public ResponseEntity<ErrorDetails> handleInternalError(
Expand Down Expand Up @@ -92,11 +96,16 @@ public ResponseEntity<ErrorDetails> handleRecordAlreadyExitsException(
return new ResponseEntity<>(errorDetails, HttpStatus.CONFLICT);
}

/** Receive {@link ConstraintViolationException} and return {@link HttpStatus#NOT_ACCEPTABLE}. */
@ExceptionHandler({ConstraintViolationException.class, MentorshipCycleClosedException.class})
/** Receive Constraints violations and return {@link HttpStatus#NOT_ACCEPTABLE}. */
@ExceptionHandler({
ApplicationMenteeWorkflowException.class,
ConstraintViolationException.class,
MentorshipCycleClosedException.class,
MenteeRegistrationLimitException.class
})
@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
public ResponseEntity<ErrorDetails> handleNotAcceptableError(
final ConstraintViolationException ex, final WebRequest request) {
final RuntimeException ex, final WebRequest request) {
final var errorDetails =
new ErrorDetails(
HttpStatus.NOT_ACCEPTABLE.value(), ex.getMessage(), request.getDescription(false));
Expand Down
Loading
Loading