Skip to content
This repository was archived by the owner on Feb 9, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
258 commits
Select commit Hold shift + click to select a range
61513e4
refactor: move pages to new modules
ykaydogdu Dec 5, 2025
fbd8534
refactor: move components in new modules
ykaydogdu Dec 5, 2025
daf06af
refactor: move utils to new modules
ykaydogdu Dec 5, 2025
0becadf
refactor: merge modules
ykaydogdu Dec 5, 2025
63a1f5d
Merge pull request #484 from bounswe/Feat/481-workplace-helpful-count…
enverern Dec 5, 2025
9078cd2
Merge pull request #486 from bounswe/feat/485-workplace-helpful-ui
ykaydogdu Dec 5, 2025
0a97306
fix: recover old tests and update imports
ykaydogdu Dec 5, 2025
9977375
feat:reshaped translations and simplify the header, completes migrati…
ykaydogdu Dec 6, 2025
67985c9
fix: remove unnecessary test
ykaydogdu Dec 6, 2025
17169d8
feat: implement volunteer application services and update NonProfitJo…
ykaydogdu Dec 7, 2025
158c049
Merge pull request #487 from bounswe/feat/429-441-refactor-architectu…
ykaydogdu Dec 7, 2025
52b6d73
feat: enhance localization and routing structure, add volunteering se…
ykaydogdu Dec 7, 2025
e50389e
fix: update routing for Employer Workplaces to use specific path
ykaydogdu Dec 7, 2025
84441f6
Merge pull request #488 from bounswe/feat/header-simplification-frontend
ykaydogdu Dec 9, 2025
bb44488
feat: integrate @tanstack/react-query and devtools for improved data …
ykaydogdu Dec 9, 2025
f2a81c2
feat: enhance error handling by introducing normalization and friendl…
ykaydogdu Dec 9, 2025
d2bdcb7
refactor: update job and application services to use React Query for …
ykaydogdu Dec 9, 2025
0967126
feat: add comprehensive error messages for localization in Arabic, En…
ykaydogdu Dec 9, 2025
23f4b3b
feat: add workplace join modal translations and update cancel button …
ykaydogdu Dec 9, 2025
1cda2b1
refactor: consolidate employer job post details and edit pages into a…
ykaydogdu Dec 9, 2025
bab66bf
refactor: update import paths and enhance review helpful hook with mu…
ykaydogdu Dec 9, 2025
19d5b8b
refactor: remove location field assertions from EmployerEditJobPostPa…
ykaydogdu Dec 9, 2025
f5b0c10
refactor: replace local state management with React Query in NonProfi…
ykaydogdu Dec 9, 2025
3a159ea
refactor: enhance workplace management features by integrating React …
ykaydogdu Dec 9, 2025
06d2f48
refactor: integrate React Query for mentorship data management
ykaydogdu Dec 9, 2025
a26c2de
refactor: replace PublicProfilePage with ProfilePage, update routing,…
ykaydogdu Dec 9, 2025
ebe7df7
refactor: update test setup and localization paths, enhance job posti…
ykaydogdu Dec 9, 2025
b45807f
refactor: update Header component for improved navigation and modify …
ykaydogdu Dec 9, 2025
6dd35ef
refactor: replace local state management with React Query for dashboa…
ykaydogdu Dec 9, 2025
47bcc50
refactor: update import paths in JobApplicationReviewPage test, enhan…
ykaydogdu Dec 9, 2025
415754c
fix: build
ykaydogdu Dec 9, 2025
cdb82f7
fix: wrongly placed review components are moved under the workplaces …
ykaydogdu Dec 9, 2025
0eb92fb
fix: implement lazy loading for WorkplaceSelector, CreateWorkplaceMod…
ykaydogdu Dec 9, 2025
2766009
refactor(profile): added gender field
CotSezer Dec 9, 2025
ddff520
refactor(profile): added functionality related gender field
CotSezer Dec 9, 2025
216a897
refactor(profile): added gender field into CreateProfileRequestDto
CotSezer Dec 9, 2025
9a80b0f
refactor(profile): added gender field into ProfileResponseDto
CotSezer Dec 9, 2025
e656d66
refactor(profile): added gender field into PublicProfileResponseDto
CotSezer Dec 9, 2025
8907917
refactor(profile): added firstName, lastName, gender and bio fields i…
CotSezer Dec 9, 2025
ab78560
refactor(profile): added gender field into RegisterRequest
CotSezer Dec 9, 2025
9c43e8c
refactor(profile): added profile registration functionality through r…
CotSezer Dec 9, 2025
5512b84
test(profile): added gender field into ProfileRepositoryTest
CotSezer Dec 9, 2025
dbb5c06
test(profile): added gender field into ProfileServiceTest
CotSezer Dec 9, 2025
86b860c
refactor(PronounSet): created common pronouns enum
CotSezer Dec 10, 2025
36eb648
refactor(PronounSet): All gender variables and related functions are …
CotSezer Dec 10, 2025
a9213fd
test(PronounSet): All gender variables and related functions are chan…
CotSezer Dec 10, 2025
2a5ac66
Merge pull request #494 from bounswe/feat/475-add-user-profile-fields…
CotSezer Dec 10, 2025
7aad1d4
feat(mentorship): add motivation field to mentorship requests and res…
CotSezer Dec 10, 2025
610132e
feat(mentorship): add motivation field to mentorship requests and res…
CotSezer Dec 10, 2025
1f0e932
Merge pull request #497 from bounswe/refactor/492-mentorship-paramete…
CotSezer Dec 10, 2025
e626e9c
fix: forum
Asaf31214 Dec 11, 2025
f468c3d
ref: remove reports from forum
Asaf31214 Dec 11, 2025
a7d02cf
Merge pull request #498 from bounswe/fix/479-forum-missing-endpoints
Asaf31214 Dec 11, 2025
7f224c4
feat(badge): add badge system with event-driven architecture
buraktigin Dec 10, 2025
e435769
fix(test): add ApplicationEventPublisher mock to ForumServiceTest
buraktigin Dec 10, 2025
ef898ca
feat(badge): add job post and job application badges
buraktigin Dec 10, 2025
4617af3
feat(badge): add mentorship badges for mentors and mentees
buraktigin Dec 10, 2025
ca3990f
remove some unneccesary badges
buraktigin Dec 10, 2025
2c671f0
remove icon field from badge model
buraktigin Dec 10, 2025
427be8b
Update BadgeService.java
buraktigin Dec 10, 2025
24c5c9d
misspels corrected
buraktigin Dec 10, 2025
47ebe60
Merge pull request #496 from bounswe/feat/261-badges
buraktigin Dec 11, 2025
9c761bb
feat(admin): implement admin and report endpoints
enverern Dec 11, 2025
48c2c4a
feat(admin): implement admin and report endpoints
enverern Dec 11, 2025
03da616
rebase conflict fix
enverern Dec 11, 2025
015c13d
show full profile of the mentor when pressed
burcukilic Dec 11, 2025
2201870
Merge pull request #491 from bounswe/refactor/371-tanstack-query
ykaydogdu Dec 11, 2025
b62d802
feat: add firstName, lastName, pronounSet and bio fields to register …
handekarabul Dec 11, 2025
4836f19
test(workplace): Fix WorkplaceServiceTest after ReviewService integra…
enverern Dec 11, 2025
f8e5e47
fix: update RegisterPage tests and fix TypeScript type errors for pro…
handekarabul Dec 11, 2025
8bf8cfb
fix: simplify pronounSet schema to fix TypeScript type errors
handekarabul Dec 11, 2025
9fa2d7e
feat: transform ResumeReviewPage to combined interface (resume + chat)
handekarabul Dec 11, 2025
053838e
Merge remote-tracking branch 'origin/fix/499-add-firstname-lastname-t…
handekarabul Dec 11, 2025
3f2924a
fix: add motivation field to mentorship request
handekarabul Dec 11, 2025
5e80bd6
Merge branch 'Feat/260-admin-moderation-endpoints' of https://github.…
enverern Dec 11, 2025
c563e3b
fix(auth): merge conflict solved
enverern Dec 11, 2025
2bc4406
fix(admin): fix import issues
enverern Dec 11, 2025
7c72864
fix(admin)
enverern Dec 11, 2025
4918eae
fix(workplace): fix global toResponse parameters
enverern Dec 11, 2025
a08750a
refactor(admin): minor endpoint and enum renaming
enverern Dec 11, 2025
077dfe1
refactor(admin): endpoint renaming
enverern Dec 11, 2025
e3ebdf6
New Endpoints for Forum
gokberkyavuz Dec 12, 2025
9a01e01
Created Forum Page UI
gokberkyavuz Dec 12, 2025
0820687
Changed Register Endpoint
gokberkyavuz Dec 12, 2025
d8a5533
Merge branch 'feat/502-register-logic-mobile' into feat/286-forum-pag…
gokberkyavuz Dec 12, 2025
a745532
Profile Navigation in Forum
gokberkyavuz Dec 12, 2025
e9c7cb8
Updates on UI
gokberkyavuz Dec 12, 2025
1fabe9c
Forum Filtering and Search
gokberkyavuz Dec 12, 2025
9f6460c
Fix Pull-to-Refresh
gokberkyavuz Dec 12, 2025
b85a8f7
add motivation text while sending mentorship request
burcukilic Dec 12, 2025
2500573
Merge pull request #503 from bounswe/feat/502-register-logic-mobile
gokberkyavuz Dec 12, 2025
0a9a958
test(admin): unit and integration tests of admin module
enverern Dec 13, 2025
ecdda92
test(report): unit and integration tests of report module
enverern Dec 13, 2025
2ee7701
Merge pull request #501 from bounswe/Feat/260-admin-moderation-endpoints
enverern Dec 13, 2025
1fb4e36
added forum integration and layout
Junklea Dec 13, 2025
06fc307
Merge pull request #500 from bounswe/fix/499-add-firstname-lastname-t…
Junklea Dec 13, 2025
c4fff9c
Merge branch 'dev' into feat/267-frontend-forum-implementation
Junklea Dec 13, 2025
ca65fbe
made the buttons look filled when clicked.
Junklea Dec 13, 2025
7f31d02
fixed build error
Junklea Dec 13, 2025
1c01fd7
feat(notification): Centralize notification service
CotSezer Dec 13, 2025
69f58af
feat(notification):
CotSezer Dec 13, 2025
6089d27
feat(notification):
CotSezer Dec 13, 2025
0883fe2
feat(notification):
CotSezer Dec 13, 2025
9e4001d
feat(notification):
CotSezer Dec 13, 2025
65914a0
test(notifications): add standalone HTML UI to validate backend webso…
CotSezer Dec 13, 2025
0101272
Merge pull request #506 from bounswe/feat/271-notification-system
Asaf31214 Dec 14, 2025
fc2278f
feat: activity stream module
Asaf31214 Dec 14, 2025
ef6293c
fix: mock service injection at tests
Asaf31214 Dec 14, 2025
453fad0
Merge branch 'dev' into feat/286-forum-page-mobile
gokberkyavuz Dec 14, 2025
7a1b426
feat: improve mentorship UI and chat functionality
handekarabul Dec 14, 2025
829dde3
fix: implement unread count reset functionality
handekarabul Dec 14, 2025
2066974
Created Report Logic
gokberkyavuz Dec 14, 2025
614a6f1
Unit and integration tests for Forum Page
gokberkyavuz Dec 14, 2025
2549f1e
Merge branch 'dev' into feat/admin-panel
handekarabul Dec 14, 2025
4b35f65
feat: enhance mentorship module with dashboard, chat improvements, an…
handekarabul Dec 14, 2025
c8438f7
added theme to toast notifications
Junklea Dec 14, 2025
e5e9981
feat: Admin report management panel and unified reporting system
handekarabul Dec 14, 2025
542858e
feat: Add ROLE_ADMIN option to registration form
handekarabul Dec 14, 2025
a927b35
fix: Add skills and interests to PublicProfile test mocks
handekarabul Dec 14, 2025
3631ead
fix: Add skills and interests to PublicProfile test mocks
handekarabul Dec 14, 2025
f222919
language support and other functionalities
Junklea Dec 14, 2025
6e5e234
fixed report service according to the backend structure
Junklea Dec 14, 2025
727dea7
feat(badge): Implement Badge system with BadgeProvider and Badge model
mbatuhancok Dec 14, 2025
c4f6f65
add mentee profile for viewing in the requests as a mentor
burcukilic Dec 14, 2025
5aa9d6c
feat(badge): Refactor badge API and introduce BadgesPage UI
mbatuhancok Dec 14, 2025
6000a4f
Merge branch 'dev' of https://github.com/bounswe/bounswe2025group4 in…
burcukilic Dec 14, 2025
0cf796a
refactor(badge): Enhance badge handling and UI presentation
mbatuhancok Dec 14, 2025
c237f40
Merge pull request #509 from bounswe/feat/286-forum-page-mobile
gokberkyavuz Dec 14, 2025
91e2cbe
feat(badge): Localize badge-related text and improve badge fetching
mbatuhancok Dec 14, 2025
e3bc7d8
feat(localization): Add badge-related localization strings for Arabic…
mbatuhancok Dec 14, 2025
274747c
refactor(badge): Update badge icon mapping and logic
mbatuhancok Dec 14, 2025
4831f75
fix mentorship request keys
burcukilic Dec 14, 2025
4778c2d
Merge branch 'dev' of https://github.com/bounswe/bounswe2025group4 in…
burcukilic Dec 14, 2025
726f32e
feat(dashboard): implement real forum statistics
buraktigin Dec 14, 2025
5022bf7
chore(.gitignore): Add generated localization files to ignore list
mbatuhancok Dec 14, 2025
0c8ce8c
Merge pull request #515 from bounswe/feat/514-community-dashboard-for…
buraktigin Dec 14, 2025
b63896e
fixed translation error in tests
Junklea Dec 14, 2025
af1b561
Merge pull request #505 from bounswe/feat/267-frontend-forum-implemen…
handekarabul Dec 14, 2025
c6cf54b
Merge dev into feat/admin-panel and resolve conflicts
handekarabul Dec 14, 2025
14305ae
Fix TypeScript errors after merging dev into admin-panel branch (fron…
handekarabul Dec 14, 2025
007ab21
fix: Add default API URL to auth pages and improve report management …
handekarabul Dec 14, 2025
2b558fb
Merge branch 'feat/483-rework-mentorship-flow-ui' of https://github.c…
handekarabul Dec 14, 2025
a598d7e
add the chat messaging functionalities
burcukilic Dec 14, 2025
661f774
Merge branch 'dev' of https://github.com/bounswe/bounswe2025group4 in…
burcukilic Dec 14, 2025
1203927
fix profile photo in request details screen
burcukilic Dec 14, 2025
9cbc02d
docs(config): configure OpenAPI and Swagger UI setup
enverern Dec 14, 2025
1f107fa
docs(activity): add Swagger documentation to Activity endpoints
enverern Dec 14, 2025
1964413
docs(workplace): add Swagger documentation to Workplace endpoints
enverern Dec 14, 2025
b239817
refactor: Remove admin registration and simplify admin layout
handekarabul Dec 14, 2025
e054a9b
docs(admin): add Swagger documentation to Admin endpoints
enverern Dec 14, 2025
1fe6c76
docs(profile): add Swagger documentation to Profile endpoints
enverern Dec 14, 2025
538a0be
docs(badge): add Swagger documentation to Badges endpoints
enverern Dec 14, 2025
36f8e0e
docs(mentorship): add Swagger documentation to Mentorship endpoints
enverern Dec 14, 2025
6331136
docs(notification): add Swagger documentation to Notifications endpoints
enverern Dec 14, 2025
f5bcc24
docs(report): add Swagger documentation to Report endpoints
enverern Dec 14, 2025
2f98590
docs(job): add Swagger documentation to Jobs and Applications endpoints
enverern Dec 14, 2025
db576c1
add direct messaging to the mentor as well
burcukilic Dec 14, 2025
cb5a6c8
docs(forum): add Swagger documentation to Forum endpoints
enverern Dec 14, 2025
d937d28
docs(dashboard): add Swagger documentation to Dashboard endpoints
enverern Dec 14, 2025
dfbc07f
Merge pull request #508 from bounswe/feat/507-activity-stream
Asaf31214 Dec 14, 2025
30c8911
fix: Chat unread count and auto-scroll improvements
handekarabul Dec 14, 2025
24f01a5
add resume upload and view buttons to the direct messaging
burcukilic Dec 14, 2025
b1584c7
add mentorship complete/cancel to the mentor
burcukilic Dec 14, 2025
34e125f
fix small bugs
burcukilic Dec 14, 2025
35829c1
convert links to prod
burcukilic Dec 14, 2025
2bb2515
Merge branch 'dev' of https://github.com/bounswe/bounswe2025group4 in…
burcukilic Dec 14, 2025
35bebd0
docs(auth): add Swagger documentation to Auth endpoints
enverern Dec 14, 2025
cdf71e2
docs: add Swagger Schema annotations to ApiError
enverern Dec 14, 2025
2bda8ad
refactor: standardize authentication injection across controllers
enverern Dec 14, 2025
f71e5cf
feat: account deletion
Asaf31214 Dec 14, 2025
49d4918
fix: review service tests
Asaf31214 Dec 15, 2025
6b6ef23
Refactor(admin): include admin user context in admin report resolution
enverern Dec 15, 2025
f774381
feat: add workspace deletion
Asaf31214 Dec 15, 2025
a16eae6
Merge pull request #524 from bounswe/feat/520-delete-account
Asaf31214 Dec 15, 2025
7a86bad
Merge branch 'dev' into Feat/516-API-documentation
enverern Dec 15, 2025
b204a32
test: fix unrelated issue
enverern Dec 15, 2025
476e653
feat: add documentation for delete account endpoint
Asaf31214 Dec 15, 2025
9520d4b
Merge pull request #525 from bounswe/Feat/516-API-documentation
Asaf31214 Dec 15, 2025
a78be50
Merge pull request #522 from bounswe/feat/290-mentorship-improve-dm
burcukilic Dec 15, 2025
65bc4c0
fix(dashboard): enable public access to community dashboard
enverern Dec 15, 2025
f7d92cd
Merge pull request #527 from bounswe/fix/526-dashboard-publicly-acces…
enverern Dec 15, 2025
fb09e25
Merge pull request #510 from bounswe/feat/483-rework-mentorship-flow-ui
handekarabul Dec 15, 2025
d8bb585
feat: add forum statistics to HomePage dashboard
ykaydogdu Dec 15, 2025
8a5cb99
feat: add dashboard handlers for community statistics
ykaydogdu Dec 15, 2025
6f63771
feat: add forum statistics and localization support for community das…
ykaydogdu Dec 15, 2025
ef4a510
merge: resolve conflicts between admin-panel and mentorship branches
handekarabul Dec 15, 2025
e2e62cf
merge: resolve conflicts with dev branch - keep mentor report functio…
handekarabul Dec 15, 2025
676d4e4
Notication System is done
koramazzz Dec 15, 2025
88a3526
Merge pull request #529 from bounswe/feat/517-dashboard-forum-frontend
ykaydogdu Dec 15, 2025
b3492c9
feat: standardize report buttons across all modules - use Flag icon a…
handekarabul Dec 15, 2025
e5d4133
fix: close Card tag in Comment.tsx
handekarabul Dec 15, 2025
fbc6689
fix: remove unused imports and parameters
handekarabul Dec 15, 2025
3c00dec
Merge remote-tracking branch 'origin/dev' into notification-mobile
koramazzz Dec 15, 2025
232f446
Merge pull request #512 from bounswe/feat/admin-panel
handekarabul Dec 15, 2025
7c046f2
Merge pull request #511 from bounswe/feat/489-toast-dark-mode
Junklea Dec 15, 2025
2a4d122
feat: add notification service and types for managing user notificati…
ykaydogdu Dec 9, 2025
770146d
refactor: replace SockJS with SharedStompClient for WebSocket handlin…
ykaydogdu Dec 9, 2025
e1cf2f9
feat: add NotificationBell component to display user notifications in…
ykaydogdu Dec 9, 2025
f88afb9
feat: add notifications localization and enhance NotificationBell com…
ykaydogdu Dec 9, 2025
1c67614
feat: add 'mark all as read' functionality and enhance notification l…
ykaydogdu Dec 12, 2025
4dd6932
feat: add 'AWARDED_BADGE' notification type and corresponding link re…
ykaydogdu Dec 14, 2025
c331582
fix: update connection check in sendReadSync method and simplify mess…
ykaydogdu Dec 15, 2025
4127f57
Notification System
koramazzz Dec 15, 2025
7618612
Merge remote-tracking branch 'origin/dev' into notification-mobile-co…
koramazzz Dec 15, 2025
31ad0db
Merge branch 'dev' into feat/478-implement-mobile-badges
mbatuhancok Dec 15, 2025
b5c5ece
Notification System is done
koramazzz Dec 15, 2025
57622de
Merge pull request #521 from bounswe/feat/278-notification-frontend
ykaydogdu Dec 15, 2025
64db500
feat: Implement badge system with definitions, service, and query hooks
ykaydogdu Dec 12, 2025
217a841
feat: Add Badges feature with new components and routing
ykaydogdu Dec 12, 2025
975344d
refactor: Enhance BadgeCard and BadgesSection components with new pro…
ykaydogdu Dec 14, 2025
34ed24d
feat(tests): add badge handlers and update tests for badge display in…
ykaydogdu Dec 14, 2025
ffa6b43
Merge pull request #523 from bounswe/feat/504-badges-frontend
ykaydogdu Dec 15, 2025
b994217
feat(activity): implement user activity service and export functionality
ykaydogdu Dec 15, 2025
7d1f380
feat(profile): enhance activity tracking and dashboard integration
ykaydogdu Dec 15, 2025
6ab9876
feat(localization): add forum activity translations and enhance activ…
ykaydogdu Dec 15, 2025
8d72b56
feat(profile): update profile tab behavior and visibility
ykaydogdu Dec 15, 2025
14846f4
fix(tests): update activity tab visibility in profile tests
ykaydogdu Dec 15, 2025
62a229e
feat(activity): enhance timestamp formatting in activity display.
ykaydogdu Dec 15, 2025
1955da6
refactor: clean up ChatProvider initialization and simplify badge dis…
mbatuhancok Dec 15, 2025
199fefc
Merge pull request #528 from bounswe/feat/518-activity-stream-frontend
ykaydogdu Dec 15, 2025
f40c3f0
Notification tests added
koramazzz Dec 15, 2025
e855c00
Merge pull request #513 from bounswe/feat/478-implement-mobile-badges
gokberkyavuz Dec 15, 2025
f81a39a
Merge remote-tracking branch 'origin/dev' into notification-mobile-co…
koramazzz Dec 15, 2025
96661b4
feat: add end-to-end tests for job application flow, including page o…
ykaydogdu Dec 15, 2025
80ad342
Badge notifications fixed
koramazzz Dec 15, 2025
cea19d2
UI request text is fixed
koramazzz Dec 15, 2025
953d343
Merge pull request #531 from bounswe/notification-mobile-complete
koramazzz Dec 15, 2025
0dad404
feat: implement report management functionality with localization sup…
ykaydogdu Dec 15, 2025
60db6ea
feat: enhance forum post and comment responses with user vote status …
ykaydogdu Dec 15, 2025
90a47d7
feat: add About, Contact, Privacy, and Terms pages with localization …
ykaydogdu Dec 15, 2025
0942d86
feat: implement voting functionality for forum posts and comments wit…
ykaydogdu Dec 15, 2025
cfafeff
fix: update default post and badge counts in ProfileHeader component …
ykaydogdu Dec 15, 2025
3633bfb
fix: update PostsTab to use userPostsQuery data instead of mockPosts
ykaydogdu Dec 15, 2025
17e8dea
fix(tests): add forum handlers for retrieving user posts
ykaydogdu Dec 15, 2025
cc0ac99
feat: enhance forum voting and notification components with state syn…
ykaydogdu Dec 15, 2025
49aff29
refactor: update forum post retrieval to support optional userId quer…
ykaydogdu Dec 15, 2025
f45b68c
Merge pull request #532 from bounswe/feat/431-e2e-job-application
ykaydogdu Dec 15, 2025
ca1cf6e
fix: update forum components to handle optional authorId and improve …
ykaydogdu Dec 15, 2025
9d7e630
fix: increase line clamp for notification title in NotificationBell c…
ykaydogdu Dec 15, 2025
00d7c43
Merge pull request #533 from bounswe/feat/519-polish-frontend
ykaydogdu Dec 15, 2025
99aa579
fix: joinworkplace broken
ykaydogdu Dec 15, 2025
ccde737
fix: update employer requests query to check for workplace ownership …
ykaydogdu Dec 15, 2025
c282fd6
docs(api): swagger fix
enverern Dec 15, 2025
83559a9
refactor: update JobCard and JobsPage to handle job location and remo…
ykaydogdu Dec 16, 2025
812f3c1
fix: update post navigation to use simplified URL structure
ykaydogdu Dec 16, 2025
f91ed1c
feat: add authentication service for account deletion and integrate i…
ykaydogdu Dec 16, 2025
32d7803
Merge pull request #534 from bounswe/feat/530-API-documentation-scena…
enverern Dec 16, 2025
92d94cc
fix(test): fix forumcontrollertest
enverern Dec 16, 2025
3398d88
refactor(auth): removed admin role from registration flow.
CotSezer Dec 16, 2025
c903f15
Merge pull request #536 from bounswe/feat/535-remove-admin-role-from-…
CotSezer Dec 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.idea
.idea# Generated localization files
lib/generated/
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.bounswe.jobboardbackend.activity.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.bounswe.jobboardbackend.activity.model.Activity;
import org.bounswe.jobboardbackend.activity.service.ActivityService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/activities")
@RequiredArgsConstructor
@PreAuthorize("isAuthenticated()")
@Tag(name = "Activity", description = "Activity Logging and Retrieval API")
public class ActivityController {

private final ActivityService activityService;

@Operation(summary = "Get User Activities", description = "Retrieves a paginated list of activities for a specific user. This endpoint is currently public.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Activities retrieved successfully")
})
@GetMapping("/user/{userId}")
public ResponseEntity<Page<Activity>> getUserActivities(
@Parameter(description = "ID of the user") @PathVariable Long userId,
@Parameter(hidden = true) Pageable pageable) {
return ResponseEntity.ok(activityService.getActivitiesByActor(userId, pageable));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.bounswe.jobboardbackend.activity.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;
import lombok.*;
import org.bounswe.jobboardbackend.auth.model.User;
import org.hibernate.annotations.CreationTimestamp;

import java.time.LocalDateTime;

@Entity
@Table(name = "activities")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "Represents a user activity in the system")
public class Activity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Schema(description = "Unique identifier of the activity", example = "1")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "actor_id", nullable = false)
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
@Schema(description = "The user who performed the activity")
private User actor;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
@Schema(description = "Type of the activity", example = "REGISTER")
private ActivityType type;

@Column(name = "entity_id")
@Schema(description = "ID of the entity related to the activity", example = "101")
private Long entityId;

@Column(name = "entity_type")
@Schema(description = "Type of the entity regarding the activity", example = "User")
private String entityType;

@CreationTimestamp
@Column(updatable = false)
@Schema(description = "Timestamp when the activity was created")
private LocalDateTime createdAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.bounswe.jobboardbackend.activity.model;

public enum ActivityType {
REGISTER,
UPDATE_PROFILE,
CREATE_WORKPLACE,
CREATE_JOB,
APPLY_JOB,
APPROVE_APPLICATION,
REJECT_APPLICATION,
CREATE_REVIEW,
REQUEST_MENTORSHIP,
ACCEPT_MENTORSHIP,
COMPLETE_MENTORSHIP,
CREATE_THREAD,
CREATE_COMMENT,
UPVOTE_THREAD,
DOWNVOTE_THREAD,
EDIT_THREAD,
DELETE_THREAD
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.bounswe.jobboardbackend.activity.repository;

import org.bounswe.jobboardbackend.activity.model.Activity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ActivityRepository extends JpaRepository<Activity, Long> {
Page<Activity> findByActorIdOrderByCreatedAtDesc(Long actorId, Pageable pageable);

void deleteByActorId(Long actorId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.bounswe.jobboardbackend.activity.service;

import lombok.RequiredArgsConstructor;
import org.bounswe.jobboardbackend.activity.model.Activity;
import org.bounswe.jobboardbackend.activity.model.ActivityType;
import org.bounswe.jobboardbackend.activity.repository.ActivityRepository;
import org.bounswe.jobboardbackend.auth.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ActivityService {

private final ActivityRepository activityRepository;

public void logActivity(User actor, ActivityType type, Long entityId, String entityType) {
Activity activity = Activity.builder()
.actor(actor)
.type(type)
.entityId(entityId)
.entityType(entityType)
.build();
activityRepository.save(activity);
}

public Page<Activity> getActivitiesByActor(Long actorId, Pageable pageable) {
return activityRepository.findByActorIdOrderByCreatedAtDesc(actorId, pageable);
}

public void deleteActivitiesByUserId(Long userId) {
activityRepository.deleteByActorId(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package org.bounswe.jobboardbackend.admin.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import org.bounswe.jobboardbackend.exception.ApiError;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.bounswe.jobboardbackend.auth.service.UserDetailsImpl;
import org.bounswe.jobboardbackend.admin.dto.AdminActionResponse;
import org.bounswe.jobboardbackend.report.dto.ReportResponse;
import org.bounswe.jobboardbackend.report.dto.ResolveReportRequest;
import org.bounswe.jobboardbackend.report.model.enums.ReportableEntityType;
import org.bounswe.jobboardbackend.report.model.enums.ReportStatus;
import org.bounswe.jobboardbackend.admin.service.AdminReportService;
import org.bounswe.jobboardbackend.report.service.ReportService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/admin/report")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ROLE_ADMIN') and isAuthenticated()")
@Tag(name = "Admin Report", description = "Admin Report Management API")
public class AdminReportController {

private final ReportService reportService;
private final AdminReportService adminReportService;

@Operation(summary = "List reports", description = "Retrieve a paginated list of reports with optional filtering by status and entity type.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "List of reports retrieved successfully"),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiError.class), examples = @ExampleObject(value = "{ \"timestamp\": \"2023-10-01T12:00:00\", \"status\": 401, \"error\": \"Unauthorized\", \"code\": \"USER_UNAUTHORIZED\", \"message\": \"Full authentication is required\", \"path\": \"/api/admin/report\" }"))),
@ApiResponse(responseCode = "403", description = "Forbidden (Admin only)", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiError.class), examples = @ExampleObject(value = "{ \"timestamp\": \"2023-10-01T12:00:00\", \"status\": 403, \"error\": \"Forbidden\", \"code\": \"ACCESS_DENIED\", \"message\": \"Access denied\", \"path\": \"/api/admin/report\" }")))
})
@GetMapping
public ResponseEntity<Page<ReportResponse>> listReports(
@Parameter(description = "Filter by report status") @RequestParam(required = false) ReportStatus status,
@Parameter(description = "Filter by entity type") @RequestParam(required = false) ReportableEntityType entityType,
@Parameter(hidden = true) @PageableDefault(size = 20) Pageable pageable){

Page<ReportResponse> reports = reportService.listReports(status, entityType, pageable);
return ResponseEntity.ok(reports);
}

@Operation(summary = "Get report details", description = "Retrieve detailed information about a specific report.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Report retrieved successfully"),
@ApiResponse(responseCode = "404", description = "Report not found", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiError.class), examples = @ExampleObject(value = "{ \"timestamp\": \"2023-10-01T12:00:00\", \"status\": 404, \"error\": \"Not Found\", \"code\": \"NOT_FOUND\", \"message\": \"Report not found\", \"path\": \"/api/admin/report/1\" }")))
})
@GetMapping("/{id}")
public ResponseEntity<ReportResponse> getReport(
@Parameter(description = "ID of the report to retrieve") @PathVariable Long id) {
ReportResponse report = reportService.getReport(id);
return ResponseEntity.ok(report);
}

@Operation(summary = "Resolve a report", description = "Take action on a report (resolve, reject) and optionally delete content or ban user.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Report resolved successfully"),
@ApiResponse(responseCode = "400", description = "Invalid request or action", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiError.class), examples = @ExampleObject(value = "{ \"timestamp\": \"2023-10-01T12:00:00\", \"status\": 400, \"error\": \"Bad Request\", \"code\": \"BAD_REQUEST\", \"message\": \"Invalid resolution status\", \"path\": \"/api/admin/report/1/resolve\" }"))),
@ApiResponse(responseCode = "404", description = "Report not found", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiError.class), examples = @ExampleObject(value = "{ \"timestamp\": \"2023-10-01T12:00:00\", \"status\": 404, \"error\": \"Not Found\", \"code\": \"NOT_FOUND\", \"message\": \"Report not found\", \"path\": \"/api/admin/report/1/resolve\" }")))
})
@PostMapping("/{id}/resolve")
public ResponseEntity<AdminActionResponse> resolveReport(
@Parameter(description = "ID of the report to resolve") @PathVariable Long id,
@Valid @RequestBody ResolveReportRequest request,
Authentication auth) {

UserDetailsImpl userDetails = (UserDetailsImpl) auth
.getPrincipal();
adminReportService.resolveReport(id, request, userDetails.getId());
return ResponseEntity.ok(new AdminActionResponse("Report resolved successfully"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.bounswe.jobboardbackend.admin.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class AdminActionResponse {
@Schema(description = "Message indicating the result of the action", example = "Report resolved successfully")
private String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.bounswe.jobboardbackend.admin.dto;

import lombok.Data;

@Data
public class BanMentorRequest {
private String reason;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.bounswe.jobboardbackend.admin.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BanUserRequest {

@NotBlank(message = "Ban reason must not be blank")
@Size(max = 500, message = "Ban reason must be at most 500 characters")
private String reason;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.bounswe.jobboardbackend.admin.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeleteContentRequest {
private String reason;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.bounswe.jobboardbackend.admin.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bounswe.jobboardbackend.auth.model.Role;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserListResponse {
private Long id;
private String username;
private String email;
private Role role;
private Boolean isBanned;
private String banReason;
private Instant createdAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.bounswe.jobboardbackend.admin.service;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.bounswe.jobboardbackend.auth.model.User;
import org.bounswe.jobboardbackend.forum.service.ForumService;

@Service
@RequiredArgsConstructor
public class AdminForumService {

private final ForumService forumService;

@Transactional
public void deletePost(Long postId, User adminUser, String reason) {
forumService.deletePost(postId, adminUser);
}

@Transactional
public void deleteComment(Long commentId, User adminUser, String reason) {
forumService.deleteComment(commentId, adminUser);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.bounswe.jobboardbackend.admin.service;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.bounswe.jobboardbackend.exception.ErrorCode;
import org.bounswe.jobboardbackend.exception.HandleException;
import org.bounswe.jobboardbackend.jobapplication.model.JobApplication;
import org.bounswe.jobboardbackend.jobapplication.repository.JobApplicationRepository;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AdminJobApplicationService {

private final JobApplicationRepository jobApplicationRepository;

@Transactional
public void deleteJobApplication(Long applicationId, String reason) {
JobApplication application = jobApplicationRepository.findById(applicationId)
.orElseThrow(
() -> new HandleException(ErrorCode.JOB_APPLICATION_NOT_FOUND, "Job application not found"));

jobApplicationRepository.delete(application);
}
}
Loading