Skip to content

Commit

Permalink
Done the required changes
Browse files Browse the repository at this point in the history
  • Loading branch information
shreya5653 committed Oct 29, 2024
1 parent 0e978fc commit a2c1797
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 104 deletions.
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,20 @@
<scope>runtime</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
Expand Down Expand Up @@ -93,13 +93,13 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/libraryman_api/book/BookController.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,4 @@ public BookDto updateBook(@PathVariable int id, @RequestBody BookDto bookDtoDeta
public void deleteBook(@PathVariable int id) {
bookService.deleteBook(id);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -349,4 +349,4 @@ public BorrowingsDto EntityToDto(Borrowings borrowings) {
borrowingsDto.setBook(bookService.EntityToDto(borrowings.getBook()));
return borrowingsDto;
}
}
}
72 changes: 49 additions & 23 deletions src/main/java/com/libraryman_api/email/EmailService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,62 +17,88 @@
import org.springframework.stereotype.Service;

/**
* Service class for sending emails asynchronously.
* This class handles the construction and sending of MIME email messages.
* Unified service class for sending emails asynchronously.
* Handles both general email sending and notifications.
*/
@Service
public class EmailService implements EmailSender {

private static final Logger LOGGER = LoggerFactory.getLogger(EmailService.class);

private final NotificationRepository notificationRepository;
private final JavaMailSender mailSender;
@Value("${spring.mail.properties.domain_name}")

@Value("${spring.mail.properties.domain_name}") // Domain name from application properties
private String domainName;

/**
* Constructs a new {@code EmailService} with the specified {@link NotificationRepository} and {@link JavaMailSender}.
*
* @param notificationRepository the repository for managing notification entities
* @param mailSender the mail sender for sending email messages
*/
public EmailService(NotificationRepository notificationRepository, JavaMailSender mailSender) {
this.notificationRepository = notificationRepository;
this.mailSender = mailSender;
}

/**
* Sends an email asynchronously to the specified recipient.
* If the email is successfully sent, the notification status is updated to SENT.
* If the email fails to send, the notification status is updated to FAILED and an exception is thrown.
* Sends a general email asynchronously.
*
* @param to the recipient's email address
* @param email the content of the email to send
* @param subject the subject of the email
* @param notification the {@link Notifications} object representing the email notification
* @param to recipient's email
* @param body email content (HTML supported)
* @param subject subject of the email
*/
@Override
@Async
public void send(String to, String email, String subject, Notifications notification) {
public void sendEmail(String to, String body, String subject) {
sendEmail(to, body, subject, null); // Default 'from' to null
}

/**
* Sends a general email asynchronously.
*
* @param to recipient's email
* @param body email content (HTML supported)
* @param subject subject of the email
* @param from sender's email address (overrides default if provided)
*/
@Async
public void sendEmail(String to, String body, String subject, String from) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, "utf-8");
helper.setText(email, true);

helper.setText(body, true); // true = enable HTML content
helper.setTo(to);
helper.setSubject(subject);
helper.setFrom(domainName);
helper.setFrom(from != null ? from : domainName); // Use provided sender or default domain

mailSender.send(mimeMessage);
} catch (MessagingException e) {
LOGGER.error("Failed to send email", e);
throw new IllegalStateException("Failed to send email", e);
}
}

/**
* Sends a notification email and updates notification status.
*
* @param to recipient's email
* @param email email content
* @param subject subject of the email
* @param notification notification entity to update status
*/
@Override
@Async
public void send(String to, String email, String subject, Notifications notification) {
try {
sendEmail(to, email, subject); // Reuse sendEmail method for notifications

// Update notification status to SENT
notification.setNotificationStatus(NotificationStatus.SENT);
notificationRepository.save(notification);
} catch (MessagingException e) {
LOGGER.error("Failed to send email", e);
} catch (Exception e) {
LOGGER.error("Failed to send notification email", e);

// Update notification status to FAILED
notification.setNotificationStatus(NotificationStatus.FAILED);
notificationRepository.save(notification);

throw new IllegalStateException("Failed to send email", e);
throw new IllegalStateException("Failed to send notification email", e);
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/libraryman_api/member/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,4 @@ public MembersDto EntityToDto(Members members) {
membersDto.setMembershipDate(members.getMembershipDate());
return membersDto;
}
}
}
32 changes: 0 additions & 32 deletions src/main/java/com/libraryman_api/newsletter/EmailService1.java

This file was deleted.

27 changes: 0 additions & 27 deletions src/main/java/com/libraryman_api/newsletter/MailConfig.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,26 +1,71 @@
package com.libraryman_api.newsletter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/newsletter")
@RequestMapping("/api/newsletter")
public class NewsletterController {

private final NewsletterService newsletterService;

@Autowired
public NewsletterController(NewsletterService newsletterService) {
this.newsletterService = newsletterService;
}

// Subscribe Endpoint
@PostMapping("/subscribe")
public String subscribe(@RequestParam String email) {
return newsletterService.subscribe(email);
public ResponseEntity<String> subscribe(@RequestParam String email) {
try {
String result = newsletterService.subscribe(email);

switch (result) {
case "Invalid email format.":
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result); // 400 Bad Request

case "Email is already subscribed.":
return ResponseEntity.status(HttpStatus.CONFLICT).body(result); // 409 Conflict

case "You have successfully subscribed!":
return ResponseEntity.status(HttpStatus.CREATED).body(result); // 201 Created

case "You have successfully re-subscribed!":
return ResponseEntity.status(HttpStatus.OK).body(result); // 200 OK

default:
return ResponseEntity.status(HttpStatus.OK).body(result); // Default 200 OK
}
} catch (Exception e) {
// Handle unexpected errors
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while processing your subscription.");
}
}

// Unsubscribe Endpoint
@GetMapping("/unsubscribe")
public String unsubscribe(@RequestParam String token) {
return newsletterService.unsubscribe(token);
public ResponseEntity<String> unsubscribe(@RequestParam String token) {
try {
String result = newsletterService.unsubscribe(token);

switch (result) {
case "Invalid or expired token.":
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result); // 404 Not Found

case "You are already unsubscribed.":
return ResponseEntity.status(HttpStatus.CONFLICT).body(result); // 409 Conflict

case "You have successfully unsubscribed!":
return ResponseEntity.status(HttpStatus.OK).body(result); // 200 OK

default:
return ResponseEntity.status(HttpStatus.OK).body(result); // Default 200 OK
}
} catch (Exception e) {
// Handle unexpected errors
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while processing your unsubscription.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,17 @@ private boolean isValidEmail(String email) {

private void sendSubscriptionEmail(String email, String token) {
String subject = "Welcome to Our Newsletter!";
String body = "Thank you for subscribing! To unsubscribe, click the link:\n" +
"http://localhost:8080/newsletter/unsubscribe?token=" + token;
emailService.send(email, body, subject, null);
String body = "Thank you for subscribing! " +
"To unsubscribe, click the link:\n" +
"http://localhost:8080/api/newsletter/unsubscribe?token=" + token;

emailService.sendEmail(email, body, subject); // No need to change this line
}

private void sendUnsubscribeEmail(String email) {
String subject = "You have been unsubscribed";
String body = "You have successfully unsubscribed. If this was a mistake, you can re-subscribe.";
emailService.send(email, body, subject, null);

emailService.sendEmail(email, body, subject); // No need to change this line
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,4 @@ public CorsFilter corsFilter() {
return new CorsFilter(corsConfigurationSource());
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,4 @@ public void signupLibrarian(Members members) {
new_members.setUsername(members.getUsername());
memberRepository.save(new_members);
}
}
}
10 changes: 9 additions & 1 deletion src/main/resources/application-development.properties
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,12 @@ spring.mail.username=Add_Your_Mail_Service_Username
spring.mail.password=Add_Your_Mail_Service_Password
spring.mail.properties.mail.smtp.auth=Add_Your_Mail_Service_SMTP
spring.mail.properties.mail.starttls.enable=Add_Your_Mail_Service_Start_TLS
spring.mail.properties.domain_name=Add_Your_Mail_Service_Domain_Name
spring.mail.properties.domain_name=Add_Your_Mail_Service_Domain_Name



# --- Oauth 2.0 Configurations ---
spring.security.oauth2.client.registration.google.client-name=google
spring.security.oauth2.client.registration.google.client-id=ADD_YOUR_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=ADD_YOUR_SECRET_KEY
spring.security.oauth2.client.registration.google.scope=email,profile

0 comments on commit a2c1797

Please sign in to comment.