Skip to content

Commit ccadc27

Browse files
Friend Validation Added in direct message
1 parent f61972c commit ccadc27

File tree

4 files changed

+112
-6
lines changed

4 files changed

+112
-6
lines changed

application.log

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,56 @@ Caused by: java.net.UnknownHostException: smtp.gmail.com
146146
at org.eclipse.angus.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2193) ~[jakarta.mail-2.0.4.jar:na]
147147
... 15 common frames omitted
148148

149+
2025-11-13T19:57:07.489+05:30 INFO 3680 --- [main] org.spacehub.Homepage : Starting Homepage using Java 17.0.15 with PID 3680 (C:\Users\prach\OneDrive\Desktop\SpaceHub\SpaceHub-Backend\target\classes started by prach in C:\Users\prach\OneDrive\Desktop\SpaceHub\SpaceHub-Backend)
150+
2025-11-13T19:57:07.494+05:30 INFO 3680 --- [main] org.spacehub.Homepage : No active profile set, falling back to 1 default profile: "default"
151+
2025-11-13T19:57:12.457+05:30 INFO 3680 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
152+
2025-11-13T19:57:12.463+05:30 INFO 3680 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
153+
2025-11-13T19:57:13.171+05:30 INFO 3680 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 687 ms. Found 20 JPA repository interfaces.
154+
2025-11-13T19:57:14.289+05:30 INFO 3680 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
155+
2025-11-13T19:57:14.313+05:30 INFO 3680 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
156+
2025-11-13T19:57:14.314+05:30 INFO 3680 --- [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.46]
157+
2025-11-13T19:57:14.415+05:30 INFO 3680 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
158+
2025-11-13T19:57:14.416+05:30 INFO 3680 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6715 ms
159+
2025-11-13T19:57:14.824+05:30 INFO 3680 --- [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
160+
2025-11-13T19:57:14.949+05:30 INFO 3680 --- [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.29.Final
161+
2025-11-13T19:57:14.966+05:30 INFO 3680 --- [main] o.h.spatial.integration.SpatialService : HHH80000001: hibernate-spatial integration enabled : true
162+
2025-11-13T19:57:15.016+05:30 INFO 3680 --- [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled
163+
2025-11-13T19:57:15.227+05:30 INFO 3680 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
164+
2025-11-13T19:57:15.649+05:30 INFO 3680 --- [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@237aba92
165+
2025-11-13T19:57:15.652+05:30 INFO 3680 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
166+
2025-11-13T19:57:15.837+05:30 INFO 3680 --- [main] org.hibernate.orm.connections.pooling : HHH10001005: Database info:
167+
Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)']
168+
Database driver: undefined/unknown
169+
Database version: 18.0
170+
Autocommit mode: undefined/unknown
171+
Isolation level: undefined/unknown
172+
Minimum pool size: undefined/unknown
173+
Maximum pool size: undefined/unknown
174+
2025-11-13T19:57:15.879+05:30 INFO 3680 --- [main] org.hibernate.spatial : HHH80000003: hibernate-spatial adding type contributions from : org.hibernate.spatial.dialect.postgis.PostgisDialectContributor
175+
2025-11-13T19:57:16.279+05:30 INFO 3680 --- [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer
176+
2025-11-13T19:57:16.322+05:30 INFO 3680 --- [main] org.hibernate.spatial : HHH80000003: hibernate-spatial adding type contributions from : org.hibernate.spatial.dialect.postgis.PostgisDialectContributor
177+
2025-11-13T19:57:17.648+05:30 INFO 3680 --- [main] org.hibernate.spatial : HHH80000004: hibernate-spatial adding function contributions from : org.hibernate.spatial.dialect.postgis.PostgisDialectContributor
178+
2025-11-13T19:57:19.196+05:30 INFO 3680 --- [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
179+
2025-11-13T19:57:21.313+05:30 INFO 3680 --- [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
180+
2025-11-13T19:57:24.016+05:30 INFO 3680 --- [main] org.redisson.Version : Redisson 3.33.0
181+
2025-11-13T19:57:25.095+05:30 INFO 3680 --- [redisson-netty-1-5] o.redisson.connection.ConnectionsHolder : 1 connections initialized for localhost/127.0.0.1:6379
182+
2025-11-13T19:57:25.375+05:30 INFO 3680 --- [redisson-netty-1-20] o.redisson.connection.ConnectionsHolder : 24 connections initialized for localhost/127.0.0.1:6379
183+
2025-11-13T19:57:25.951+05:30 INFO 3680 --- [main] o.s.d.j.r.query.QueryEnhancerFactory : Hibernate is in classpath; If applicable, HQL parser will be used.
184+
2025-11-13T19:57:30.315+05:30 INFO 3680 --- [main] eAuthenticationProviderManagerConfigurer : Global AuthenticationManager configured with AuthenticationProvider bean with name authenticationProvider
185+
2025-11-13T19:57:31.418+05:30 INFO 3680 --- [main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
186+
2025-11-13T19:57:32.656+05:30 INFO 3680 --- [main] o.s.m.s.b.SimpleBrokerMessageHandler : Starting...
187+
2025-11-13T19:57:32.657+05:30 INFO 3680 --- [main] o.s.m.s.b.SimpleBrokerMessageHandler : BrokerAvailabilityEvent[available=true, SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@4e94f258]]
188+
2025-11-13T19:57:32.658+05:30 INFO 3680 --- [main] o.s.m.s.b.SimpleBrokerMessageHandler : Started.
189+
2025-11-13T19:57:32.693+05:30 INFO 3680 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
190+
2025-11-13T19:57:32.719+05:30 INFO 3680 --- [main] org.spacehub.Homepage : Started Homepage in 27.325 seconds (process running for 29.044)
191+
2025-11-13T19:57:33.315+05:30 INFO 3680 --- [RMI TCP Connection(1)-172.24.112.1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
192+
2025-11-13T19:57:33.316+05:30 INFO 3680 --- [RMI TCP Connection(1)-172.24.112.1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
193+
2025-11-13T19:57:33.323+05:30 INFO 3680 --- [RMI TCP Connection(1)-172.24.112.1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
194+
2025-11-13T19:57:39.379+05:30 INFO 3680 --- [SpringApplicationShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
195+
2025-11-13T19:57:39.530+05:30 INFO 3680 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
196+
2025-11-13T19:57:39.556+05:30 INFO 3680 --- [SpringApplicationShutdownHook] o.s.m.s.b.SimpleBrokerMessageHandler : Stopping...
197+
2025-11-13T19:57:39.557+05:30 INFO 3680 --- [SpringApplicationShutdownHook] o.s.m.s.b.SimpleBrokerMessageHandler : BrokerAvailabilityEvent[available=false, SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@4e94f258]]
198+
2025-11-13T19:57:39.557+05:30 INFO 3680 --- [SpringApplicationShutdownHook] o.s.m.s.b.SimpleBrokerMessageHandler : Stopped.
199+
2025-11-13T19:57:42.157+05:30 INFO 3680 --- [SpringApplicationShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
200+
2025-11-13T19:57:42.169+05:30 INFO 3680 --- [SpringApplicationShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
201+
2025-11-13T19:57:42.213+05:30 INFO 3680 --- [SpringApplicationShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

src/main/java/org/spacehub/entities/Friends/Friends.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ public class Friends {
1818
@GeneratedValue(strategy = GenerationType.AUTO)
1919
private UUID id;
2020

21-
@ManyToOne
21+
@ManyToOne(fetch = FetchType.LAZY)
2222
@JoinColumn(name = "user_id", nullable = false)
2323
private User user;
2424

25-
@ManyToOne
25+
@ManyToOne(fetch = FetchType.LAZY)
2626
@JoinColumn(name = "friend_id", nullable = false)
2727
private User friend;
2828

src/main/java/org/spacehub/handler/ChatWebSocketHandlerMessaging.java

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.spacehub.entities.DirectMessaging.Message;
88
import org.spacehub.entities.User.User;
99
import org.spacehub.repository.User.UserRepository;
10+
import org.spacehub.service.Friend.FriendService;
1011
import org.spacehub.service.Message.MessageQueueService;
1112
import org.spacehub.service.Interface.IMessageService;
1213
import org.springframework.lang.NonNull;
@@ -35,15 +36,21 @@ public class ChatWebSocketHandlerMessaging extends TextWebSocketHandler{
3536
private final Map<String, WebSocketSession> activeUsers = new ConcurrentHashMap<>();
3637
private final Map<WebSocketSession, Map<String, String>> sessionMetadata = new ConcurrentHashMap<>();
3738
private final Map<String, String> usernameCache = new ConcurrentHashMap<>();
39+
private final FriendService friendService;
40+
41+
public ChatWebSocketHandlerMessaging(
42+
MessageQueueService messageQueueService,
43+
IMessageService messageService,
44+
S3Service s3Service,
45+
UserRepository userRepository,
46+
FriendService friendService) {
3847

39-
public ChatWebSocketHandlerMessaging(MessageQueueService messageQueueService,
40-
IMessageService messageService,
41-
S3Service s3Service,
42-
UserRepository userRepository) {
4348
this.messageQueueService = messageQueueService;
4449
this.messageService = messageService;
4550
this.s3Service = s3Service;
4651
this.userRepository = userRepository;
52+
this.friendService = friendService;
53+
4754
this.objectMapper = new ObjectMapper()
4855
.registerModule(new JavaTimeModule())
4956
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -61,12 +68,35 @@ public void afterConnectionEstablished(@NonNull WebSocketSession session) throws
6168
return;
6269
}
6370

71+
if (userRepository.findByEmail(senderEmail).isEmpty()) {
72+
sendSystemMessage(session, "Sender does not exist.");
73+
session.close(CloseStatus.BAD_DATA);
74+
return;
75+
}
76+
6477
activeUsers.put(senderEmail, session);
6578
sessionMetadata.put(session, params);
6679
sendSystemMessage(session, "Connected as " + senderEmail);
6780

6881
processUnreadMessages(session, senderEmail);
6982

83+
if (receiverEmail != null) {
84+
85+
if (userRepository.findByEmail(receiverEmail).isEmpty()) {
86+
sendSystemMessage(session, "Receiver not found.");
87+
session.close(CloseStatus.BAD_DATA);
88+
return;
89+
}
90+
91+
if (!friendService.areFriends(senderEmail, receiverEmail)) {
92+
sendSystemMessage(session, "You can only chat with friends.");
93+
session.close(CloseStatus.NOT_ACCEPTABLE);
94+
return;
95+
}
96+
}
97+
98+
processUnreadMessages(session, senderEmail);
99+
70100
if (receiverEmail != null) {
71101
processHistoryForReceiver(session, senderEmail, receiverEmail);
72102
}
@@ -158,6 +188,11 @@ protected void handleTextMessage(@NonNull WebSocketSession session, @NonNull Tex
158188
}
159189

160190
private void handleTextOnlyMessage(String senderEmail, String receiverEmail, Map<String, Object> payload) throws IOException {
191+
192+
if (!friendService.areFriends(senderEmail, receiverEmail)) {
193+
throw new RuntimeException("Cannot message non-friends.");
194+
}
195+
161196
Message mess = Message.builder()
162197
.messageUuid(UUID.randomUUID().toString())
163198
.senderEmail(senderEmail)
@@ -175,6 +210,11 @@ private void handleTextOnlyMessage(String senderEmail, String receiverEmail, Map
175210
}
176211

177212
private void handleFileMessage(String senderEmail, String receiverEmail, Map<String, Object> payload) throws IOException {
213+
214+
if (!friendService.areFriends(senderEmail, receiverEmail)) {
215+
throw new RuntimeException("Cannot message non-friends.");
216+
}
217+
178218
String fileKey = (String) payload.get("fileKey");
179219
String fileName = (String) payload.get("fileName");
180220
String contentType = (String) payload.get("contentType");

src/main/java/org/spacehub/service/Friend/FriendService.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,4 +344,17 @@ private void sendFriendListUpdate(User target, User newFriend) {
344344
}
345345
}
346346

347+
public boolean areFriends(String email1, String email2) {
348+
if (email1 == null || email1.isBlank() || email2 == null || email2.isBlank())
349+
return false;
350+
351+
User user1 = userRepository.findByEmail(email1).orElse(null);
352+
User user2 = userRepository.findByEmail(email2).orElse(null);
353+
354+
if (user1 == null || user2 == null)
355+
return false;
356+
357+
return friendsRepository.findByUserAndFriendAndStatus(user1, user2, "accepted").isPresent() || friendsRepository.findByUserAndFriendAndStatus(user2, user1, "accepted").isPresent();
358+
}
359+
347360
}

0 commit comments

Comments
 (0)