diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..c84e048 Binary files /dev/null and b/.DS_Store differ diff --git a/README.md b/README.md index 1530e9c..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,33 +0,0 @@ -# Login Registration Backend - -Complete login registration backend system using Spring Boot. - -[![YouTube Video](https://user-images.githubusercontent.com/40702606/104790682-d62ac880-578f-11eb-8353-aa68739ffe42.png)](https://www.youtube.com/watch?v=QwQuro7ekvc) - -- [x] Spring Boot -- [x] Spring Security -- [x] Java Mail -- [x] Email verification with expiry -- [x] Spring Boot - -## Diagram -![Screenshot 2021-01-13 at 23 38 08](https://user-images.githubusercontent.com/40702606/104789980-15581a00-578e-11eb-998d-30f2e6a9f461.png) - -## Email verification link with expiry -![Screenshot 2021-01-13 at 23 37 33](https://user-images.githubusercontent.com/40702606/104789893-0c674880-578e-11eb-939a-2a1cd3a8dfd2.png) - -## Example requests -### Postman -![Screenshot 2021-01-13 at 23 37 57](https://user-images.githubusercontent.com/40702606/104790087-7a137480-578e-11eb-8141-307a8850c39e.png) - -### CURL -``` -curl --location --request POST 'localhost:8080/api/v1/registration' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "firstName": "Amigos", - "lastName": "Code", - "email": "hellow@amigoscode.com", - "password": "password" -}' -``` diff --git a/pom.xml b/pom.xml index 167df52..25a3a5d 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,11 @@ + + mysql + mysql-connector-java + runtime + org.springframework.boot spring-boot-starter-data-jpa @@ -36,14 +41,15 @@ spring-boot-starter-web - + org.projectlombok lombok + 1.18.22 true @@ -51,15 +57,36 @@ spring-boot-starter-test test + + + commons-io + commons-io + 2.6 + + org.springframework.security spring-security-test test + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + org.springframework.boot spring-boot-maven-plugin diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..731abbc Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000..2143673 Binary files /dev/null and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000..79907fd Binary files /dev/null and b/src/main/java/.DS_Store differ diff --git a/src/main/java/com/example/demo/appuser/AppUserRole.java b/src/main/java/com/example/demo/appuser/AppUserRole.java deleted file mode 100644 index b05de93..0000000 --- a/src/main/java/com/example/demo/appuser/AppUserRole.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.demo.appuser; - -public enum AppUserRole { - USER, - ADMIN -} diff --git a/src/main/java/com/example/demo/email/EmailService.java b/src/main/java/com/example/demo/email/EmailService.java deleted file mode 100644 index 975c44f..0000000 --- a/src/main/java/com/example/demo/email/EmailService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.demo.email; - -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; - -@Service -@AllArgsConstructor -public class EmailService implements EmailSender{ - - private final static Logger LOGGER = LoggerFactory - .getLogger(EmailService.class); - - private final JavaMailSender mailSender; - - @Override - @Async - public void send(String to, String email) { - try { - MimeMessage mimeMessage = mailSender.createMimeMessage(); - MimeMessageHelper helper = - new MimeMessageHelper(mimeMessage, "utf-8"); - helper.setText(email, true); - helper.setTo(to); - helper.setSubject("Confirm your email"); - helper.setFrom("hello@amigoscode.com"); - mailSender.send(mimeMessage); - } catch (MessagingException e) { - LOGGER.error("failed to send email", e); - throw new IllegalStateException("failed to send email"); - } - } -} diff --git a/src/main/java/com/example/demo/registration/RegistrationController.java b/src/main/java/com/example/demo/registration/RegistrationController.java deleted file mode 100644 index c8b12b8..0000000 --- a/src/main/java/com/example/demo/registration/RegistrationController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.demo.registration; - -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping(path = "api/v1/registration") -@AllArgsConstructor -public class RegistrationController { - - private final RegistrationService registrationService; - - @PostMapping - public String register(@RequestBody RegistrationRequest request) { - return registrationService.register(request); - } - - @GetMapping(path = "confirm") - public String confirm(@RequestParam("token") String token) { - return registrationService.confirmToken(token); - } - -} diff --git a/src/main/java/com/example/demo/registration/RegistrationService.java b/src/main/java/com/example/demo/registration/RegistrationService.java deleted file mode 100644 index f505b11..0000000 --- a/src/main/java/com/example/demo/registration/RegistrationService.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.example.demo.registration; - -import com.example.demo.appuser.AppUser; -import com.example.demo.appuser.AppUserRole; -import com.example.demo.appuser.AppUserService; -import com.example.demo.email.EmailSender; -import com.example.demo.registration.token.ConfirmationToken; -import com.example.demo.registration.token.ConfirmationTokenService; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -@Service -@AllArgsConstructor -public class RegistrationService { - - private final AppUserService appUserService; - private final EmailValidator emailValidator; - private final ConfirmationTokenService confirmationTokenService; - private final EmailSender emailSender; - - public String register(RegistrationRequest request) { - boolean isValidEmail = emailValidator. - test(request.getEmail()); - - if (!isValidEmail) { - throw new IllegalStateException("email not valid"); - } - - String token = appUserService.signUpUser( - new AppUser( - request.getFirstName(), - request.getLastName(), - request.getEmail(), - request.getPassword(), - AppUserRole.USER - - ) - ); - - String link = "http://localhost:8080/api/v1/registration/confirm?token=" + token; - emailSender.send( - request.getEmail(), - buildEmail(request.getFirstName(), link)); - - return token; - } - - @Transactional - public String confirmToken(String token) { - ConfirmationToken confirmationToken = confirmationTokenService - .getToken(token) - .orElseThrow(() -> - new IllegalStateException("token not found")); - - if (confirmationToken.getConfirmedAt() != null) { - throw new IllegalStateException("email already confirmed"); - } - - LocalDateTime expiredAt = confirmationToken.getExpiresAt(); - - if (expiredAt.isBefore(LocalDateTime.now())) { - throw new IllegalStateException("token expired"); - } - - confirmationTokenService.setConfirmedAt(token); - appUserService.enableAppUser( - confirmationToken.getAppUser().getEmail()); - return "confirmed"; - } - - private String buildEmail(String name, String link) { - return "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " Confirm your email\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "


\n" + - " \n" + - "

Hi " + name + ",

Thank you for registering. Please click on the below link to activate your account:

Activate Now

\n Link will expire in 15 minutes.

See you soon

" + - " \n" + - "


\n" + - "\n" + - "
"; - } -} diff --git a/src/main/java/ethniconnect_backend/.DS_Store b/src/main/java/ethniconnect_backend/.DS_Store new file mode 100644 index 0000000..97f23b1 Binary files /dev/null and b/src/main/java/ethniconnect_backend/.DS_Store differ diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenu.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenu.java new file mode 100644 index 0000000..7044b56 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenu.java @@ -0,0 +1,56 @@ +package ethniconnect_backend.ChefCreateMenu; + +import ethniconnect_backend.ChefDetails.Chef; +import ethniconnect_backend.Cuisines.CuisineCategory; +import ethniconnect_backend.Order.Order; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor + +@Entity +@Table(name = "chefmenu") +public class ChefMenu { + @Id + @GeneratedValue + private int id; + private long login_id; + @Enumerated(EnumType.STRING) + private MenuCategories menucategories; + //private int cuisine_id; + @Lob + @Column(columnDefinition = "MEDIUMBLOB") + private String menu_item_image; + private String item_name; + private double menu_item_price; + private String item_ingredients; + private String item_intresting_facts; + @Enumerated(EnumType.STRING) + private Week week; + + //@ManyToOne + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "cuisine_id") + private CuisineCategory cuisineCategory; + @ManyToMany(mappedBy = "menu_items") + Set orders; + + /* @OneToOne + @JoinColumn (name="login_id", insertable = false, updatable = false) + private Chef chef;*/ + /*@JoinTable( + name = "selected_cuisines", + joinColumns = @JoinColumn(name = "menu_item_id"), + inverseJoinColumns = @JoinColumn(name = "cuisine_id")) + Set selectedCuisines;*/ + /* @OneToMany + @OneToMany(fetch = FetchType.EAGER, mappedBy = "menu_items", cascade = CascadeType.ALL) + @JsonIgnoreProperties("menu") + private List storyList = new ArrayList<>();*/ +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuController.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuController.java new file mode 100644 index 0000000..1708ce2 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuController.java @@ -0,0 +1,60 @@ +package ethniconnect_backend.ChefCreateMenu; + +import ethniconnect_backend.ChefDetails.Chef; +import ethniconnect_backend.ChefDetails.ChefService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +@CrossOrigin() +@RestController +public class ChefMenuController { + + @Autowired + private ChefMenuService chefMenuService; + @Autowired + private ChefMenuRepository chefMenuRepository; + + @PostMapping("/chefmenu") + + public String addChefMenu(@RequestParam("file") MultipartFile file, + @RequestParam("login_id") long login_id, + @RequestParam("menucategories") MenuCategories menuCategories, + @RequestParam("cuisine_id") int cuisine_id, + @RequestParam("item_name") String item_name, + + @RequestParam("menu_item_price") double menu_item_price, + @RequestParam("item_ingredients") String item_ingredients, + @RequestParam("item_intresting_facts") String item_intresting_facts, + @RequestParam("week") Week week) throws Exception { + chefMenuService.saveChefMenu(file, login_id, menuCategories,cuisine_id, + item_name,menu_item_price,item_ingredients,item_intresting_facts,week); + return "chef details added"; + } + + @GetMapping({"/chefmenuById/{id}"}) + public ChefMenuGETResponse findChefMenuById(@PathVariable int id) + { + return chefMenuService.getChefMenuById(id); + } + + @PutMapping("/updatechefmenu") + public ChefMenu updateChefMenu(@RequestBody ChefMenu chefMenu) + { + return chefMenuService.updateChefMenu(chefMenu); + } +} +/* @GetMapping({"/chefByCuisineId/{cuisineId}"}) + public List getChefByCuisineId(@PathVariable String cuisineId) + { + return chefProfileService.getChefByCuisineId(cuisineId); + } + + @GetMapping({"/getCuisinesByZipCode/{zipCode}"}) + public List getCuisinesByZipCode(@PathVariable String zipCode) + { + return chefProfileService.getCuisinesByZipCode(zipCode); + }*/ + + diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuGETResponse.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuGETResponse.java new file mode 100644 index 0000000..2235167 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuGETResponse.java @@ -0,0 +1,26 @@ +package ethniconnect_backend.ChefCreateMenu; + +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + + +@Builder +@Getter +@Setter +@Data +public class ChefMenuGETResponse { + + private long login_id; + private int cuisine_id; + private MenuCategories menucategories; + private String menu_item_image; + private String item_name; + private double menu_item_price; + private String item_ingredients; + private String item_intresting_facts; + private Week week; + + +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRepository.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRepository.java new file mode 100644 index 0000000..fc0f80a --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRepository.java @@ -0,0 +1,12 @@ +package ethniconnect_backend.ChefCreateMenu; + +import org.springframework.data.jpa.repository.JpaRepository; + + +import java.util.Optional; + +public interface ChefMenuRepository extends JpaRepository { + + //Optional findById(Integer id); + //ChefMenu findByLogin_id(long chef_login_Id); +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRequest.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRequest.java new file mode 100644 index 0000000..e528c8f --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuRequest.java @@ -0,0 +1,29 @@ +package ethniconnect_backend.ChefCreateMenu; + +import ethniconnect_backend.Cuisines.CuisineCategory; +import lombok.*; + +import javax.persistence.*; + +@Data +@Builder +@Getter +@Setter +@AllArgsConstructor +@ToString +public class ChefMenuRequest { + private int id; + private long login_id; + @Enumerated(EnumType.STRING) + private MenuCategories menucategories; + private int cuisine_id; + private String menu_item_image; + private String item_name; + private int menu_item_price; + private String item_ingredients; + private String item_intresting_facts; + @Enumerated(EnumType.STRING) + private Week week; + + +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuService.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuService.java new file mode 100644 index 0000000..dadf90e --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/ChefMenuService.java @@ -0,0 +1,131 @@ +package ethniconnect_backend.ChefCreateMenu; + +import ethniconnect_backend.ChefDetails.Chef; +import ethniconnect_backend.ChefDetails.ChefRepository; +import ethniconnect_backend.Cuisines.CuisineCategoriesRepository; +import ethniconnect_backend.Cuisines.CuisineCategory; +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Base64; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +@Service +public class ChefMenuService { + + @Autowired + private ChefMenuRepository chefMenuRepository; + @Autowired + private UserCredentialsRepository userCredentialsRepository; + + @Autowired + CuisineCategoriesRepository cuisineCategoriesRepository; + @Autowired + private ChefRepository chefRepository; + + + public void saveChefMenu(MultipartFile file, Long login_id,MenuCategories menucategories,int cuisine_id, + String item_name,double menu_item_price,String item_ingredients, + String item_intresting_facts,Week week + ) throws Exception + { + ChefMenu chefMenu =new ChefMenu(); + Optional userData = userCredentialsRepository.findById(login_id); + if(!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + Optional cuisineCategory = cuisineCategoriesRepository.findById(cuisine_id); + // Long loginId = userData.get().getId(); + if(cuisineCategory == null) + throw new Exception("cuisine category doesn't exist"); + + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + if(fileName.contains("..")) + { + System.out.println("not a a valid file"); + } + try { + chefMenu.setMenu_item_image(Base64.getEncoder().encodeToString(file.getBytes())); + } catch (IOException e) { + e.printStackTrace(); + } + chefMenu.setLogin_id(login_id); + chefMenu.setMenucategories(menucategories); + + chefMenu.setMenu_item_price(menu_item_price); + chefMenu.setItem_name(item_name); + chefMenu.setItem_intresting_facts(item_intresting_facts); + chefMenu.setItem_ingredients(item_ingredients); + chefMenu.setCuisineCategory(cuisineCategory.get()); + chefMenu.setWeek(week); + + chefMenuRepository.save(chefMenu); + } + + public List saveChefMenus(List chefMenus){ + return chefMenuRepository.saveAll(chefMenus); + } + + public List getChefMenus() + { + return chefMenuRepository.findAll(); + } + public ChefMenuGETResponse getChefMenuById(int id) + { + ChefMenu chefMenu = chefMenuRepository.findById(id).get(); + + ChefMenuGETResponse chefMenuGETResponse = ChefMenuGETResponse.builder() + .cuisine_id(chefMenu.getCuisineCategory().getId()) + .login_id(chefMenu.getLogin_id()) + .menucategories(chefMenu.getMenucategories()) + .item_name(chefMenu.getItem_name()) + .menu_item_image(chefMenu.getMenu_item_image()) + .menu_item_price(chefMenu.getMenu_item_price()) + .item_ingredients(chefMenu.getItem_ingredients()) + .item_intresting_facts(chefMenu.getItem_intresting_facts()) + .week(chefMenu.getWeek()) + .build(); + return chefMenuGETResponse; + + + } + + public String deleteChefMenu(int chefMenu_id) + { + chefMenuRepository.deleteById(chefMenu_id); + return "chef Menu ietem removed !!" + chefMenu_id; + } + public ChefMenu updateChefMenu(ChefMenu chefMenu) + { + ChefMenu existingChefMenu=chefMenuRepository.findById(chefMenu.getId()).orElse(null); + existingChefMenu.setMenucategories(chefMenu.getMenucategories()); + existingChefMenu.setMenu_item_image(chefMenu.getMenu_item_image()); + existingChefMenu.setItem_name(chefMenu.getItem_name()); + existingChefMenu.setMenu_item_price(chefMenu.getMenu_item_price()); + existingChefMenu.setItem_ingredients(chefMenu.getItem_ingredients()); + existingChefMenu.setItem_intresting_facts(chefMenu.getItem_intresting_facts()); + existingChefMenu.setWeek(chefMenu.getWeek()); + existingChefMenu.getCuisineCategory().setId(chefMenu.getCuisineCategory().getId()); + return chefMenuRepository.save(existingChefMenu); + + + } +// public List getChefByCuisineId(String cuisine_id){ +// +// return chefRepository.getChefsByPrefCuisine(Integer.getInteger(cuisine_id)); +// } + /* public List getCuisineCategoriesByZipCode(String zipCode){ + CuisineCategory cuisineCategory= new CuisineCategory(); + List chefs = chefRepository.getChefsByZip(zipCode); + Set categorieId = chefs.stream().map((chef)->chefMenuRepository.findByLogin_id(chef.getLogin_id())).map((chefMenu)->chefMenu.getCuisineCategory()).map((cuisineCategory)->cuisineCategory.getCuisine_name()).distinct().collect(Collectors.toSet()); + List cuisineCategories = cuisineCategoriesRepository.findAllById(cuisineId); + return cuisineCategories; + } +*/ +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/MenuCategories.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/MenuCategories.java new file mode 100644 index 0000000..42287c6 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/MenuCategories.java @@ -0,0 +1,10 @@ +package ethniconnect_backend.ChefCreateMenu; + +public enum MenuCategories { + + + Breakfast, + Lunch, + Dinner + +} diff --git a/src/main/java/ethniconnect_backend/ChefCreateMenu/Week.java b/src/main/java/ethniconnect_backend/ChefCreateMenu/Week.java new file mode 100644 index 0000000..6d1e3ce --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefCreateMenu/Week.java @@ -0,0 +1,11 @@ +package ethniconnect_backend.ChefCreateMenu; + +public enum Week { + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday +} diff --git a/src/main/java/ethniconnect_backend/ChefDetails/Chef.java b/src/main/java/ethniconnect_backend/ChefDetails/Chef.java new file mode 100644 index 0000000..9881b74 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefDetails/Chef.java @@ -0,0 +1,48 @@ +package ethniconnect_backend.ChefDetails; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "chef") + //(uniqueConstraints={@UniqueConstraint(columnNames = {"chef_emailid"})}) + + +public class Chef { + @Id + @GeneratedValue + private int chef_id; + private long login_id; + private String chef_fname; + private String chef_lname; + private String chef_emailid; + private String chef_phone; + private String chef_street; + private String chef_city; + private String chef_state; + private String chef_zip; + private String chef_paymode; + private String chef_description; + private int chef_experience; + private String chef_fblink; + private String chef_linkdin; + /*@Lob + @Column(name = "Image", length = Integer.MAX_VALUE, nullable = true) + private byte[] chef_image;*/ + @Lob + @Column(columnDefinition = "MEDIUMBLOB") + private String chef_image; + + + + /* @OneToMany (targetEntity = ChefMenu.class, cascade = CascadeType.ALL) + @JoinColumn(name = "cm_fk" , referencedColumnName = "login_id") + private List chefmenus;*/ + +} diff --git a/src/main/java/ethniconnect_backend/ChefDetails/ChefController.java b/src/main/java/ethniconnect_backend/ChefDetails/ChefController.java new file mode 100644 index 0000000..0189917 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefDetails/ChefController.java @@ -0,0 +1,63 @@ +package ethniconnect_backend.ChefDetails; + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@CrossOrigin() +@RestController +public class ChefController { + @Autowired + private ChefService chefProfileService; + @Autowired + private ChefRepository chefRepository; + @PostMapping("/chef") + public String addchef(@RequestParam("file") MultipartFile file, + @RequestParam("chef_fname") String fname, + @RequestParam("chef_lname") String lname, + @RequestParam("chef_emailid") String emailid, + @RequestParam("chef_phone") String chef_phone, + @RequestParam("chef_street") String chef_street, + @RequestParam("chef_city") String chef_city, + @RequestParam("chef_state") String chef_state, + @RequestParam("chef_zip") String chef_zip, + @RequestParam("chef_paymode") String chef_paymode, + @RequestParam("chef_description") String chef_description, + @RequestParam("chef_experience") int chef_experience, + @RequestParam("chef_fblink") String chef_fblink, + @RequestParam("chef_linkdin") String chef_linkdin) throws Exception { + chefProfileService.saveChef(file, fname, lname,emailid,chef_phone,chef_street, + chef_city,chef_state,chef_zip,chef_paymode,chef_description, + chef_experience,chef_fblink,chef_linkdin); + return "chef details added"; + } + + /* @PostMapping("/chef") + public Chef addChef(@RequestBody Chef chef) throws Exception + { + return chefProfileService.saveChef(chef); + }*/ + + + @GetMapping({"/chefById/{id}"}) + public Chef findChefById(@PathVariable int id) + { + return chefProfileService.getChefById(id); + } + + @PutMapping("/updatechef") + public Chef updateChef(@RequestBody Chef chef) + { + return chefProfileService.updateChef(chef); + } + + /* @GetMapping({"/chefprofile"}) + public List getChefProfileInfo() + { + return chefRepository.getChefProfileInfo(); + }*/ + + + +} diff --git a/src/main/java/ethniconnect_backend/ChefDetails/ChefRepository.java b/src/main/java/ethniconnect_backend/ChefDetails/ChefRepository.java new file mode 100644 index 0000000..7a5bbf6 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefDetails/ChefRepository.java @@ -0,0 +1,16 @@ +package ethniconnect_backend.ChefDetails; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Optional; + +public interface ChefRepository extends JpaRepository { + + + /* *//*@Query("SELECT new ethniconnect_backend.ChefDetails.ChefprofileResponse( c.chef_fname, m.menu_item_price)" + + " FROM Chef c join c.ChefMenu m")*//* + public List getChefProfileInfo();*/ + +} diff --git a/src/main/java/ethniconnect_backend/ChefDetails/ChefService.java b/src/main/java/ethniconnect_backend/ChefDetails/ChefService.java new file mode 100644 index 0000000..8557364 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefDetails/ChefService.java @@ -0,0 +1,118 @@ +package ethniconnect_backend.ChefDetails; + +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import ethniconnect_backend.UserCredentials.UserCredentials; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Base64; +import java.util.List; +import java.util.Optional; + +@Service +public class ChefService { + @Autowired + private ChefRepository chefRepository; + @Autowired + private UserCredentialsRepository userCredentialsRepository; + + public void saveChef(MultipartFile file, String fname,String lname,String emailid, + String chef_phone,String chef_street,String chef_city, + String chef_state,String chef_zip,String chef_paymode, + String chef_description,int chef_experience,String chef_fblink, + String chef_linkdin) throws Exception + { + Chef chef =new Chef(); + Optional userData = userCredentialsRepository.findByEmail(emailid); + if(!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + + + + + Long loginId = userData.get().getId(); + + chef.setLogin_id(loginId); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + if(fileName.contains("..")) + { + System.out.println("not a a valid file"); + } + try { + chef.setChef_image(Base64.getEncoder().encodeToString(file.getBytes())); + } catch (IOException e) { + e.printStackTrace(); + } + chef.setChef_fname(fname); + + chef.setChef_lname(lname); + chef.setChef_emailid(emailid); + chef.setChef_city(chef_city); + chef.setChef_phone(chef_phone); + chef.setChef_street(chef_street); + chef.setChef_state(chef_state); + chef.setChef_zip(chef_zip); + chef.setChef_paymode(chef_paymode); + chef.setChef_description(chef_description); + chef.setChef_experience(chef_experience); + chef.setChef_fblink(chef_fblink); + chef.setChef_linkdin(chef_linkdin); + chefRepository.save(chef); + } + + /*public Chef saveChef(Chef chef) throws Exception{ + Optional userData = userCredentialsRepository.findByEmail(chef.getChef_emailid()); + if(!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + Long loginId = userData.get().getId(); + + chef.setLogin_id(loginId); + + return chefRepository.save(chef); + }*/ + public List saveChefs(List chefs){ + return chefRepository.saveAll(chefs); + } + + public List getChefs() + { + return chefRepository.findAll(); + } + public Chef getChefById(int chef_id){ + return chefRepository.findById(chef_id).orElse(null); + } + + public String deleteChef(int chef_id) + { + chefRepository.deleteById(chef_id); + return "chef removed !!" + chef_id; + } + public Chef updateChef(Chef chef) + { + Chef existingChef= (Chef) chefRepository.findById(chef.getChef_id()).orElse(null); + existingChef.setChef_fname(chef.getChef_fname()!=null?chef.getChef_fname():existingChef.getChef_fname()); + existingChef.setChef_lname(chef.getChef_lname()!=null?chef.getChef_lname():existingChef.getChef_lname()); + existingChef.setChef_phone(chef.getChef_phone()!=null?chef.getChef_phone():existingChef.getChef_phone()); + existingChef.setChef_city(chef.getChef_city()!=null?chef.getChef_city():existingChef.getChef_city()); + existingChef.setChef_description(chef.getChef_description()!=null?chef.getChef_description():existingChef.getChef_description()); + existingChef.setChef_fblink(chef.getChef_fblink()!=null?chef.getChef_fblink():existingChef.getChef_fblink()); + existingChef.setChef_linkdin(chef.getChef_linkdin()!=null?chef.getChef_linkdin():existingChef.getChef_linkdin()); + existingChef.setChef_image(chef.getChef_image()!=null?chef.getChef_image():existingChef.getChef_image()); + existingChef.setChef_paymode(chef.getChef_paymode()!=null?chef.getChef_paymode():existingChef.getChef_paymode()); + existingChef.setChef_state(chef.getChef_state()!=null?chef.getChef_state():existingChef.getChef_state()); + existingChef.setChef_street(chef.getChef_street()!=null?chef.getChef_street():existingChef.getChef_street()); + existingChef.setChef_zip(chef.getChef_zip()!=null?chef.getChef_zip():existingChef.getChef_zip()); + existingChef.setChef_city(chef.getChef_city()!=null?chef.getChef_city():existingChef.getChef_city()); + existingChef.setChef_experience(chef.getChef_experience()!=0?chef.getChef_experience():existingChef.getChef_experience()); + return chefRepository.save(existingChef); + + } + + + + +} diff --git a/src/main/java/ethniconnect_backend/ChefDetails/ChefprofileResponse.java b/src/main/java/ethniconnect_backend/ChefDetails/ChefprofileResponse.java new file mode 100644 index 0000000..a577888 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefDetails/ChefprofileResponse.java @@ -0,0 +1,15 @@ +package ethniconnect_backend.ChefDetails; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ChefprofileResponse { + private String chef_name; + private int menu_item_price; +} diff --git a/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupController.java b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupController.java new file mode 100644 index 0000000..b3cf4f3 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupController.java @@ -0,0 +1,36 @@ +package ethniconnect_backend.ChefSignup; + +import ethniconnect_backend.ChefCreateMenu.ChefMenuRequest; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@CrossOrigin() +@RestController +//@RequestMapping(path = "api/v1/registration") +@AllArgsConstructor +public class ChefSignupController { + + private final ChefSignupService registrationService; + @PostMapping("api/v1/registration") + public String register(@RequestBody ChefSignupRequest chefSignupRequest) + { + registrationService.register(chefSignupRequest); + return "signup successfull"; + } + + + /*@PostMapping("api/v1/registration") + public void register( @RequestParam("email") String email, + @RequestParam("password") String password) + { + registrationService.register(email,password); + }*/ + + @GetMapping("api/v1/registration/confirm") + public String confirm(@RequestParam("token") String token) { + return registrationService.confirmToken(token); + } + + + } diff --git a/src/main/java/com/example/demo/registration/RegistrationRequest.java b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupRequest.java similarity index 61% rename from src/main/java/com/example/demo/registration/RegistrationRequest.java rename to src/main/java/ethniconnect_backend/ChefSignup/ChefSignupRequest.java index 2dd483a..e318c79 100644 --- a/src/main/java/com/example/demo/registration/RegistrationRequest.java +++ b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupRequest.java @@ -1,4 +1,4 @@ -package com.example.demo.registration; +package ethniconnect_backend.ChefSignup; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; @@ -9,9 +9,9 @@ @AllArgsConstructor @EqualsAndHashCode @ToString -public class RegistrationRequest { - private final String firstName; - private final String lastName; +public class ChefSignupRequest { + //private final String firstName; + /* private final String lastName;*/ private final String email; private final String password; } diff --git a/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupService.java b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupService.java new file mode 100644 index 0000000..4d49548 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ChefSignup/ChefSignupService.java @@ -0,0 +1,81 @@ +package ethniconnect_backend.ChefSignup; + +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserRole; +import ethniconnect_backend.UserCredentials.UserCredentialsService; +import ethniconnect_backend.email.EmailSender; +import ethniconnect_backend.email.EmailService; +import ethniconnect_backend.ChefSignup.token.ConfirmationToken; +import ethniconnect_backend.ChefSignup.token.ConfirmationTokenService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +@AllArgsConstructor +public class ChefSignupService { + + private final UserCredentialsService userCredentialsService; + private final EmailValidator emailValidator; + private final ConfirmationTokenService confirmationTokenService; + private final EmailSender emailSender; + private EmailService emailService; + + public void register(ChefSignupRequest chefSignupRequest) { + boolean isValidEmail = emailValidator. + test(chefSignupRequest.getEmail()); + + if (!isValidEmail) { + throw new IllegalStateException("email not valid"); + } + + + + String token = userCredentialsService.signUpUser( + new UserCredentials( + chefSignupRequest.getEmail(), + chefSignupRequest.getPassword(), + UserRole.BUSINESS + + ) + ); + + /*String link = "www.google.com";*/ + String link = "http://localhost:5000/api/v1/registration/confirm?token=" + token; + emailSender.send( + chefSignupRequest.getEmail(), + emailService.buildEmail("user", link)); + + //return token; + } + + @Transactional + public String confirmToken(String token) { + ConfirmationToken confirmationToken = confirmationTokenService + .getToken(token) + .orElseThrow(() -> + new IllegalStateException("token not found")); + + if (confirmationToken.getConfirmedAt() != null) { + throw new IllegalStateException("email already confirmed"); + } + + LocalDateTime expiredAt = confirmationToken.getExpiresAt(); + + if (expiredAt.isBefore(LocalDateTime.now())) { + throw new IllegalStateException("token expired"); + } + + confirmationTokenService.setConfirmedAt(token); + userCredentialsService.enableAppUser( + confirmationToken.getAppUser().getEmail()); + return "confirmed"; + } + + + + + +} diff --git a/src/main/java/com/example/demo/registration/EmailValidator.java b/src/main/java/ethniconnect_backend/ChefSignup/EmailValidator.java similarity index 86% rename from src/main/java/com/example/demo/registration/EmailValidator.java rename to src/main/java/ethniconnect_backend/ChefSignup/EmailValidator.java index 085cbe0..0225c8b 100644 --- a/src/main/java/com/example/demo/registration/EmailValidator.java +++ b/src/main/java/ethniconnect_backend/ChefSignup/EmailValidator.java @@ -1,4 +1,4 @@ -package com.example.demo.registration; +package ethniconnect_backend.ChefSignup; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/demo/registration/token/ConfirmationToken.java b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationToken.java similarity index 82% rename from src/main/java/com/example/demo/registration/token/ConfirmationToken.java rename to src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationToken.java index fa90b09..e3a9afb 100644 --- a/src/main/java/com/example/demo/registration/token/ConfirmationToken.java +++ b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationToken.java @@ -1,6 +1,6 @@ -package com.example.demo.registration.token; +package ethniconnect_backend.ChefSignup.token; -import com.example.demo.appuser.AppUser; +import ethniconnect_backend.UserCredentials.UserCredentials; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -42,15 +42,15 @@ public class ConfirmationToken { nullable = false, name = "app_user_id" ) - private AppUser appUser; + private UserCredentials appUser; public ConfirmationToken(String token, LocalDateTime createdAt, LocalDateTime expiresAt, - AppUser appUser) { + UserCredentials userCredentials) { this.token = token; this.createdAt = createdAt; this.expiresAt = expiresAt; - this.appUser = appUser; + this.appUser = userCredentials; } } diff --git a/src/main/java/com/example/demo/registration/token/ConfirmationTokenRepository.java b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenRepository.java similarity index 94% rename from src/main/java/com/example/demo/registration/token/ConfirmationTokenRepository.java rename to src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenRepository.java index a9c7b0d..a78ec0b 100644 --- a/src/main/java/com/example/demo/registration/token/ConfirmationTokenRepository.java +++ b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenRepository.java @@ -1,4 +1,4 @@ -package com.example.demo.registration.token; +package ethniconnect_backend.ChefSignup.token; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/src/main/java/com/example/demo/registration/token/ConfirmationTokenService.java b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenService.java similarity index 93% rename from src/main/java/com/example/demo/registration/token/ConfirmationTokenService.java rename to src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenService.java index 8d268a0..e52a4d6 100644 --- a/src/main/java/com/example/demo/registration/token/ConfirmationTokenService.java +++ b/src/main/java/ethniconnect_backend/ChefSignup/token/ConfirmationTokenService.java @@ -1,4 +1,4 @@ -package com.example.demo.registration.token; +package ethniconnect_backend.ChefSignup.token; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/ethniconnect_backend/ContactPage/Contact.java b/src/main/java/ethniconnect_backend/ContactPage/Contact.java new file mode 100644 index 0000000..34d396b --- /dev/null +++ b/src/main/java/ethniconnect_backend/ContactPage/Contact.java @@ -0,0 +1,25 @@ +package ethniconnect_backend.ContactPage; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "contact") +public class Contact { + @Id + @GeneratedValue + private int id; + private String name; + private String emailid; + private String message; + +} diff --git a/src/main/java/ethniconnect_backend/ContactPage/ContactController.java b/src/main/java/ethniconnect_backend/ContactPage/ContactController.java new file mode 100644 index 0000000..a12e011 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ContactPage/ContactController.java @@ -0,0 +1,40 @@ +package ethniconnect_backend.ContactPage; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +@CrossOrigin() +@RestController +public class ContactController { + @Autowired + private ContactService contactService; + @Autowired + private ContactRepository contactRepository; + + @PostMapping("/ContactRequest") + public void addcontactrequest(@RequestParam("name") String name, + @RequestParam("email") String email, + @RequestParam("message") String message + ) + { + contactService.saveContactRequest(name,email,message); + + //return "request added"; + } + + @GetMapping({"/ContactRequests"}) + public List findcontactrequests() + + { + return contactService.getContactRequets(); + } + + @GetMapping({"/ContactRequestById/{id}"}) + public Contact findcontactrequestbyId(@PathVariable int id) + { + return contactService.getContactRequestById(id); + } + +} diff --git a/src/main/java/ethniconnect_backend/ContactPage/ContactEmailValidator.java b/src/main/java/ethniconnect_backend/ContactPage/ContactEmailValidator.java new file mode 100644 index 0000000..c250901 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ContactPage/ContactEmailValidator.java @@ -0,0 +1,14 @@ +package ethniconnect_backend.ContactPage; + +import org.springframework.stereotype.Service; + +import java.util.function.Predicate; + +@Service +public class ContactEmailValidator implements Predicate { + @Override + public boolean test(String s) { +// TODO: Regex to validate email + return true; + } +} diff --git a/src/main/java/ethniconnect_backend/ContactPage/ContactRepository.java b/src/main/java/ethniconnect_backend/ContactPage/ContactRepository.java new file mode 100644 index 0000000..324f2e4 --- /dev/null +++ b/src/main/java/ethniconnect_backend/ContactPage/ContactRepository.java @@ -0,0 +1,7 @@ +package ethniconnect_backend.ContactPage; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ContactRepository extends JpaRepository +{ +} diff --git a/src/main/java/ethniconnect_backend/ContactPage/ContactService.java b/src/main/java/ethniconnect_backend/ContactPage/ContactService.java new file mode 100644 index 0000000..a8c092f --- /dev/null +++ b/src/main/java/ethniconnect_backend/ContactPage/ContactService.java @@ -0,0 +1,70 @@ +package ethniconnect_backend.ContactPage; + +import ethniconnect_backend.ChefSignup.ChefSignupRequest; +import ethniconnect_backend.ChefSignup.EmailValidator; +import ethniconnect_backend.ChefSignup.token.ConfirmationTokenService; +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserCredentialsService; +import ethniconnect_backend.UserCredentials.UserRole; + +import ethniconnect_backend.email.EmailSender; +import ethniconnect_backend.email.EmailService; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.xml.transform.sax.SAXTransformerFactory; +import java.util.List; + +@Service +@AllArgsConstructor +public class ContactService { + private final UserCredentialsService userCredentialsService; + private final EmailValidator emailValidator; + private final ConfirmationTokenService confirmationTokenService; + private final EmailSender emailSender; + private EmailService emailService; + + @Autowired + public ContactRepository contactRepository; + + /* public Contact saveContact(Contact contact) + { + return contactRepository.save(contact); + }*/ + + + public void saveContactRequest(String email, String name, String message) { + boolean isValidEmail = emailValidator. + test(email); + + if (!isValidEmail) { + throw new IllegalStateException("email not valid"); + } + + + /*String link = "www.google.com";*/ + Contact contact = new Contact(); + contact.setEmailid(email); + contact.setMessage(message); + contact.setName(name); + contactRepository.save(contact); + emailSender.send( + "ethniconnect@gmail.com", + emailService.buildContactEmail(message,email)); + contactRepository.save(contact); + + //return token; + } + + + public List getContactRequets() + { + return contactRepository.findAll(); + } + public Contact getContactRequestById(int id) + { + return contactRepository.findById(id).orElse(null); + } + +} diff --git a/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesController.java b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesController.java new file mode 100644 index 0000000..3b6b772 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesController.java @@ -0,0 +1,37 @@ +package ethniconnect_backend.Cuisines; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +@CrossOrigin() +@RestController +public class CuisineCategoriesController { + + @Autowired + private CuisinesCategoriesService cuisinesCategoriesService; + + @PostMapping("/CuisineCategory") + public CuisineCategory addcuisinecategory(@RequestBody CuisineCategory cuisineCategories) + { + + return cuisinesCategoriesService.saveCuisineCatgeory(cuisineCategories); + } + + @GetMapping({"/CuisnesCategoryRequests"}) + public List findcontactrequests() + + { + return cuisinesCategoriesService.getCusineCategoriesRequets(); + } + + @GetMapping({"/ContactCategoryById/{id}"}) + public CuisineCategory findcuisinecategoryrequestbyId(@PathVariable int id) + { + return cuisinesCategoriesService.getCuisineCategoryById(id); + } + +} + + diff --git a/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesRepository.java b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesRepository.java new file mode 100644 index 0000000..9a808c6 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategoriesRepository.java @@ -0,0 +1,6 @@ +package ethniconnect_backend.Cuisines; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CuisineCategoriesRepository extends JpaRepository { +} diff --git a/src/main/java/ethniconnect_backend/Cuisines/CuisineCategory.java b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategory.java new file mode 100644 index 0000000..007a8a1 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Cuisines/CuisineCategory.java @@ -0,0 +1,31 @@ +package ethniconnect_backend.Cuisines; + +import ethniconnect_backend.ChefCreateMenu.ChefMenu; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +import javax.persistence.*; +import java.util.List; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor + +@Entity +@Table(name = "cuisinecategory") + +public class CuisineCategory { + @Id + @GeneratedValue + private int id; + @Column(unique = true) + private String cuisine_name; + private String cuisine_image; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "cuisineCategory") + private List menus; + +} diff --git a/src/main/java/ethniconnect_backend/Cuisines/CuisinesCategoriesService.java b/src/main/java/ethniconnect_backend/Cuisines/CuisinesCategoriesService.java new file mode 100644 index 0000000..29f3718 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Cuisines/CuisinesCategoriesService.java @@ -0,0 +1,27 @@ +package ethniconnect_backend.Cuisines; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +@Service +public class CuisinesCategoriesService { + + @Autowired + public CuisineCategoriesRepository cuisineCategoriesRepository; + public CuisineCategory saveCuisineCatgeory(CuisineCategory cuisineCategories) + { + return (CuisineCategory) cuisineCategoriesRepository.save(cuisineCategories); + } + + public List getCusineCategoriesRequets() + { + return cuisineCategoriesRepository.findAll(); + } + public CuisineCategory getCuisineCategoryById(int id) + { + return (CuisineCategory) cuisineCategoriesRepository.findById(id).orElse(null); + } + +} + diff --git a/src/main/java/ethniconnect_backend/CustomerDetails/Customer.java b/src/main/java/ethniconnect_backend/CustomerDetails/Customer.java new file mode 100644 index 0000000..54eab73 --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerDetails/Customer.java @@ -0,0 +1,42 @@ +package ethniconnect_backend.CustomerDetails; + +import ethniconnect_backend.ChefCreateMenu.ChefMenu; +import ethniconnect_backend.Order.Order; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.List; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "customer") +public class Customer { + @Id + @GeneratedValue + private int cust_id; + private long login_id; + private String cust_fname; + private String cust_lname; + private String cust_emailid; + private String cust_phone; + private String cust_street; + private String cust_city; + private String cust_state; + private String cust_zip; + + + @Lob + @Column(columnDefinition = "MEDIUMBLOB") + private String cust_image; + /*@OneToMany(fetch = FetchType.LAZY, mappedBy = "customer") + private List orders;*/ + @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY, + cascade = CascadeType.ALL) + private Set orders; + +} diff --git a/src/main/java/ethniconnect_backend/CustomerDetails/CustomerController.java b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerController.java new file mode 100644 index 0000000..5ecc3f9 --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerController.java @@ -0,0 +1,51 @@ +package ethniconnect_backend.CustomerDetails; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@CrossOrigin() + +@RestController +public class CustomerController { + + @Autowired + private CustomerService customerService; + + @PostMapping("/customer") + + public String addcustomer(@RequestParam("file") MultipartFile file, + @RequestParam("cust_fname") String fname, + @RequestParam("cust_lname") String lname, + @RequestParam("cust_emailid") String emailid, + @RequestParam("cust_phone") String phone, + @RequestParam("cust_street") String street, + @RequestParam("cust_city") String city, + @RequestParam("cust_state") String state, + @RequestParam("cust_zip") String zip + ) throws Exception { + customerService.saveCustomer(file, fname, lname,emailid,phone,street, + city,state,zip); + return "customer details added"; + } + + /* public Customer addCustomer(@RequestBody Customer customer) throws Exception + { + + return customerService.saveCustomer(customer); + } +*/ + + @GetMapping({"/custById/{id}"}) + public Customer findCustById(@PathVariable int id) + { + return customerService.getCustById(id); + } + + @PutMapping("/updatecust") + public Customer updateCust(@RequestBody Customer customer) + { + return customerService.updateCust(customer); + } +} diff --git a/src/main/java/ethniconnect_backend/CustomerDetails/CustomerRepository.java b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerRepository.java new file mode 100644 index 0000000..5cfe323 --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerRepository.java @@ -0,0 +1,12 @@ +package ethniconnect_backend.CustomerDetails; + +import ethniconnect_backend.ChefDetails.ChefprofileResponse; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface CustomerRepository extends JpaRepository { + + +} \ No newline at end of file diff --git a/src/main/java/ethniconnect_backend/CustomerDetails/CustomerService.java b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerService.java new file mode 100644 index 0000000..f7a403a --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerDetails/CustomerService.java @@ -0,0 +1,101 @@ +package ethniconnect_backend.CustomerDetails; + + +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import ethniconnect_backend.UserCredentials.UserCredentials; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Base64; +import java.util.List; +import java.util.Optional; + +@Service +public class CustomerService { + @Autowired + private CustomerRepository customerRepository; + @Autowired + private UserCredentialsRepository userCredentialsRepository; + + public void saveCustomer(MultipartFile file, String fname, String lname, String emailid, + String phone, String street, String city, + String state, String zip) throws Exception + { + Customer customer =new Customer(); + Optional userData = userCredentialsRepository.findByEmail(emailid); + if(!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + Long loginId = userData.get().getId(); + + customer.setLogin_id(loginId); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + if(fileName.contains("..")) + { + System.out.println("not a a valid file"); + } + try { + customer.setCust_image(Base64.getEncoder().encodeToString(file.getBytes())); + } catch (IOException e) { + e.printStackTrace(); + } + + customer.setCust_fname(fname); + customer.setCust_lname(lname); + customer.setCust_emailid(emailid); + customer.setCust_city(city); + customer.setCust_phone(phone); + customer.setCust_street(street); + customer.setCust_state(state); + customer.setCust_city(city); + customer.setCust_zip(zip); + + customerRepository.save(customer); + } + + /*public Customer saveCustomer(Customer customer) throws Exception{ + Optional userData =appUserRepository.findByEmail(customer.getCust_emailid()); + if(!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + Long loginId = userData.get().getId(); + + customer.setLogin_id(loginId); + return customerRepository.save(customer); + }*/ + public List saveChefs(List customers){ + return customerRepository.saveAll(customers); + } + + public List getCustomers() + { + return customerRepository.findAll(); + } + public Customer getCustById(int cust_id){ + return customerRepository.findById(cust_id).orElse(null); + } + /*public Chef getChefByEmailId(String chef_emailid){ + return chefProfileRepository.findByEmailId(chef_emailid); + }*/ + public String deleteCust(int cust_id) + { + customerRepository.deleteById(cust_id); + return "customer removed !!" + cust_id; + } + public Customer updateCust(Customer customer) + { + Customer existingCustomer=customerRepository.findById(customer.getCust_id()).orElse(null); + existingCustomer.setCust_fname(customer.getCust_fname()); + existingCustomer.setCust_lname(customer.getCust_lname()); + existingCustomer.setCust_phone(customer.getCust_phone()); + existingCustomer.setCust_emailid(customer.getCust_emailid()); + existingCustomer.setCust_street(customer.getCust_street()); + existingCustomer.setCust_city(customer.getCust_city()); + existingCustomer.setCust_state(customer.getCust_state()); + existingCustomer.setCust_zip(customer.getCust_zip()); + existingCustomer.setCust_image(customer.getCust_image()); + return customerRepository.save(existingCustomer); + + } +} \ No newline at end of file diff --git a/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupController.java b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupController.java new file mode 100644 index 0000000..b82f3e5 --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupController.java @@ -0,0 +1,30 @@ +package ethniconnect_backend.CustomerSignup; + +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + + + + + +@CrossOrigin() +@RestController +//@RequestMapping +@AllArgsConstructor +public class CustSignupController { + + private final CustSignupService custSignupService; + + @PostMapping("api/v1/CustSignup") + public void register(@RequestParam("email") String email, + @RequestParam("password") String password) { + custSignupService.register(email,password); + } + + @GetMapping("api/v1/CustSignup/confirm") + public String confirm(@RequestParam("token") String token) { + return custSignupService.confirmToken(token); + } + + +} diff --git a/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupRequest.java b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupRequest.java new file mode 100644 index 0000000..f34e9eb --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupRequest.java @@ -0,0 +1,19 @@ +package ethniconnect_backend.CustomerSignup; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + + +@Getter +@AllArgsConstructor +@EqualsAndHashCode +@ToString +public class CustSignupRequest { + + //private final String firstName; + /* private final String lastName;*/ + private final String email; + private final String password; +} diff --git a/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupService.java b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupService.java new file mode 100644 index 0000000..3788322 --- /dev/null +++ b/src/main/java/ethniconnect_backend/CustomerSignup/CustSignupService.java @@ -0,0 +1,80 @@ +package ethniconnect_backend.CustomerSignup; + +import ethniconnect_backend.UserCredentials.UserCredentialsService; +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserRole; +import ethniconnect_backend.email.EmailSender; +import ethniconnect_backend.email.EmailService; +import ethniconnect_backend.ChefSignup.EmailValidator; +import ethniconnect_backend.ChefSignup.token.ConfirmationToken; +import ethniconnect_backend.ChefSignup.token.ConfirmationTokenService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + + @Service + @AllArgsConstructor + public class CustSignupService { + + private final UserCredentialsService appUserService; + private final EmailValidator emailValidator; + private final ConfirmationTokenService confirmationTokenService; + private final EmailSender emailSender; + private EmailService emailService; + + public void register(String email, String password) { + boolean isValidEmail = emailValidator. + test(email); + + if (!isValidEmail) { + throw new IllegalStateException("email not valid"); + } + + String token = appUserService.signUpUser( + new UserCredentials( + email, + password, + UserRole.PERSONAL + + ) + ); + + /*String link = "www.google.com";*/ + String link = "http://localhost:5000/api/v1/registration/confirm?token=" + token; + emailSender.send( + email, + emailService.buildEmail("user", link)); + + //return token; + } + + @Transactional + public String confirmToken(String token) { + ConfirmationToken confirmationToken = confirmationTokenService + .getToken(token) + .orElseThrow(() -> + new IllegalStateException("token not found")); + + if (confirmationToken.getConfirmedAt() != null) { + throw new IllegalStateException("email already confirmed"); + } + + LocalDateTime expiredAt = confirmationToken.getExpiresAt(); + + if (expiredAt.isBefore(LocalDateTime.now())) { + throw new IllegalStateException("token expired"); + } + + confirmationTokenService.setConfirmedAt(token); + appUserService.enableAppUser( + confirmationToken.getAppUser().getEmail()); + return "confirmed"; + } + + + + + + } diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/ethniconnect_backend/DemoApplication.java similarity index 90% rename from src/main/java/com/example/demo/DemoApplication.java rename to src/main/java/ethniconnect_backend/DemoApplication.java index 64b538a..e716579 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/ethniconnect_backend/DemoApplication.java @@ -1,8 +1,9 @@ -package com.example.demo; +package ethniconnect_backend; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; + @SpringBootApplication public class DemoApplication { diff --git a/src/main/java/ethniconnect_backend/Login/Login.java b/src/main/java/ethniconnect_backend/Login/Login.java new file mode 100644 index 0000000..675098d --- /dev/null +++ b/src/main/java/ethniconnect_backend/Login/Login.java @@ -0,0 +1,16 @@ +package ethniconnect_backend.Login; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@EqualsAndHashCode +@ToString +@Setter +public class Login { + private String emailId; + private String password; +} + diff --git a/src/main/java/ethniconnect_backend/Login/LoginController.java b/src/main/java/ethniconnect_backend/Login/LoginController.java new file mode 100644 index 0000000..e4059f5 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Login/LoginController.java @@ -0,0 +1,48 @@ +package ethniconnect_backend.Login; + +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +@CrossOrigin() +@RestController +public class LoginController +{ + + @Autowired + public UserCredentialsRepository userCredentialsRepository; + + @Autowired + BCryptPasswordEncoder bCryptPasswordEncoder; + + + + @PostMapping("/signin") + public ResponseEntity authenticateUser(@RequestBody UserCredentials userCredentials) + { + UserCredentials userCredentialsFromDB = userCredentialsRepository.findByEmail(userCredentials.getEmail()).get(); + LoginResponse loginResponse = new LoginResponse(); + if(userCredentials.getEmail().equals(userCredentialsFromDB.getEmail()) + && bCryptPasswordEncoder.matches(userCredentials.getPassword(),userCredentialsFromDB.getPassword()) + && (userCredentialsFromDB.getEnabled().booleanValue() || userCredentialsFromDB.getEnabled() == true)) + { + //return new ResponseEntity<>("User signed-in successfully!.", HttpStatus.OK); + + loginResponse.setLoginId(userCredentialsFromDB.getId()); + return new ResponseEntity<>(loginResponse, HttpStatus.OK); + } + loginResponse.setErrormessage("User credentials are wrong"); + if(!(userCredentialsFromDB.getEnabled().booleanValue() || userCredentialsFromDB.getEnabled() == true)) + { + loginResponse.setErrormessage("Account not activated"); + } + //SecurityContextHolder.getContext().setAuthentication(authentication); + return new ResponseEntity<>(loginResponse, HttpStatus.UNAUTHORIZED); + } +} diff --git a/src/main/java/ethniconnect_backend/Login/LoginResponse.java b/src/main/java/ethniconnect_backend/Login/LoginResponse.java new file mode 100644 index 0000000..a85a1e9 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Login/LoginResponse.java @@ -0,0 +1,13 @@ +package ethniconnect_backend.Login; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Getter +@Setter +public class LoginResponse { + private long loginId; + private String errormessage; +} diff --git a/src/main/java/ethniconnect_backend/Login/LoginService.java b/src/main/java/ethniconnect_backend/Login/LoginService.java new file mode 100644 index 0000000..45453fd --- /dev/null +++ b/src/main/java/ethniconnect_backend/Login/LoginService.java @@ -0,0 +1,4 @@ +package ethniconnect_backend.Login; + +public class LoginService { +} diff --git a/src/main/java/ethniconnect_backend/Order/Order.java b/src/main/java/ethniconnect_backend/Order/Order.java new file mode 100644 index 0000000..142fc76 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Order/Order.java @@ -0,0 +1,49 @@ +package ethniconnect_backend.Order; + + +import ethniconnect_backend.ChefCreateMenu.ChefMenu; +import ethniconnect_backend.Cuisines.CuisineCategory; +import ethniconnect_backend.CustomerDetails.Customer; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +import javax.persistence.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "order") +public class Order { + @Id + @GeneratedValue + private int order_id; + private long login_id; + private int cust_id; + private int menu_id; + private LocalDate order_date; + private LocalDateTime pickup_time; + private String order_instructions; + private double order_amount; + + /* @OneToOne(fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + mappedBy = "orders") + private Customer customer;*/ + @ManyToOne + @JoinColumn(name="cust_id", insertable = false, updatable = false) + private Customer customer; + @ManyToMany + @JoinTable( + name = "order_menu", + joinColumns = @JoinColumn(name = "order_id"), + inverseJoinColumns = @JoinColumn(name = "id")) + Set menu_items; +} diff --git a/src/main/java/ethniconnect_backend/Order/OrderController.java b/src/main/java/ethniconnect_backend/Order/OrderController.java new file mode 100644 index 0000000..d99e175 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Order/OrderController.java @@ -0,0 +1,48 @@ +package ethniconnect_backend.Order; + +import ethniconnect_backend.ChefCreateMenu.*; +import ethniconnect_backend.ChefCreateMenu.OrderRequest; +import org.aspectj.weaver.ast.Or; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +@RestController +public class OrderController { + + @Autowired + private OrderService orderService; + @Autowired + private OrderRepository orderRepository; + + @PostMapping("/order") + public ResponseEntity addOrder(@RequestBody OrderRequest orderRequest) throws Exception + { + + //chefMenuService.saveChefMenu(ch); + orderService.saveOrder(orderRequest); + + return new ResponseEntity<>("order is places successfully", HttpStatus.OK); + } + /* @PostMapping("/chefs") + public List addChefs(@RequestBody List chefs) + { + return chefProfileService.saveChefs(chefs); + }*/ + + @GetMapping({"/getOrderById/{id}"}) + public Order findOrderById(@PathVariable int id) + { + return orderService.getOrderById(id); + } + + @PutMapping("/updateorder") + public Order updateOrder(@RequestBody Order order) + { + return orderService.updateOrder(order); + } +} + + + + diff --git a/src/main/java/ethniconnect_backend/Order/OrderRepository.java b/src/main/java/ethniconnect_backend/Order/OrderRepository.java new file mode 100644 index 0000000..a0b472a --- /dev/null +++ b/src/main/java/ethniconnect_backend/Order/OrderRepository.java @@ -0,0 +1,12 @@ +package ethniconnect_backend.Order; + +import ethniconnect_backend.ChefCreateMenu.ChefMenu; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + + +public interface OrderRepository extends JpaRepository { + + //Optional findOrderById(Integer id); +} diff --git a/src/main/java/ethniconnect_backend/Order/OrderRequest.java b/src/main/java/ethniconnect_backend/Order/OrderRequest.java new file mode 100644 index 0000000..173f4c5 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Order/OrderRequest.java @@ -0,0 +1,30 @@ +package ethniconnect_backend.ChefCreateMenu; + +import ethniconnect_backend.Cuisines.CuisineCategory; +import lombok.*; + +import javax.persistence.*; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@Builder +@Getter +@Setter +@AllArgsConstructor +@ToString + +public class OrderRequest { + + private int order_id; + private long login_id; + private int cust_id; + private int menu_id; + private LocalDate order_date; + private LocalDateTime pickup_time; + private String order_instructions; + private double order_amount; + +} + + diff --git a/src/main/java/ethniconnect_backend/Order/OrderService.java b/src/main/java/ethniconnect_backend/Order/OrderService.java new file mode 100644 index 0000000..7e1eda2 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Order/OrderService.java @@ -0,0 +1,93 @@ +package ethniconnect_backend.Order; + +import ethniconnect_backend.ChefCreateMenu.ChefMenu; +import ethniconnect_backend.ChefCreateMenu.ChefMenuRepository; +import ethniconnect_backend.ChefCreateMenu.ChefMenuRequest; +import ethniconnect_backend.ChefCreateMenu.OrderRequest; +import ethniconnect_backend.Cuisines.CuisineCategoriesRepository; +import ethniconnect_backend.Cuisines.CuisineCategory; +import ethniconnect_backend.CustomerDetails.Customer; +import ethniconnect_backend.CustomerDetails.CustomerRepository; +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import org.apache.maven.artifact.repository.Authentication; +import org.aspectj.weaver.ast.Or; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +@Service +public class OrderService { + + + + @Autowired + private ChefMenuRepository chefMenuRepository; + @Autowired + private UserCredentialsRepository userCredentialsRepository; + @Autowired + private CustomerRepository customerRepository; + + @Autowired + CuisineCategoriesRepository cuisineCategoriesRepository; + @Autowired + OrderRepository orderRepository; + + public Order saveOrder(OrderRequest orderRequest) throws Exception { + + + Optional userData = userCredentialsRepository.findById(orderRequest.getLogin_id()); + if (!userData.isPresent()) + throw new Exception("user Id doesn't exist"); + Customer customer = customerRepository.findById(orderRequest.getCust_id()).get(); + // Long loginId = userData.get().getId(); + if (customer == null) + throw new Exception("cuisine category doesn't exist"); + Order order = new Order(); + orderRequest.setLogin_id(orderRequest.getLogin_id()); + orderRequest.setCust_id(orderRequest.getCust_id()); + orderRequest.setMenu_id(orderRequest.getMenu_id()); + orderRequest.setOrder_instructions(orderRequest.getOrder_instructions()); + orderRequest.setOrder_date(orderRequest.getOrder_date()); + orderRequest.setPickup_time(orderRequest.getPickup_time()); + orderRequest.setOrder_amount(orderRequest.getOrder_amount()); + orderRequest.setLogin_id(orderRequest.getLogin_id()); + return orderRepository.save(order); + + + } + /* public List saveOrders(List orders){ + return OrderRepository.saveAll(orders); + }*/ + + public List getOrders() + { + return orderRepository.findAll(); + } + public Order getOrderById(int order_id){ + return orderRepository.findById(order_id).orElse(null); + } + + public String deleteorder(int order_id) + { + orderRepository.deleteById(order_id); + return "order deleted " + order_id; + } + public Order updateOrder(Order order) + { + Order existingOrder=orderRepository.findById(order.getOrder_id()).orElse(null); + existingOrder.setOrder_amount(order.getOrder_amount()); + existingOrder.setOrder_date(order.getOrder_date()); + existingOrder.setOrder_instructions(order.getOrder_instructions()); + existingOrder.setMenu_id(order.getMenu_id()); + existingOrder.setPickup_time(order.getPickup_time()); + existingOrder.setCust_id(order.getCust_id()); + + return orderRepository.save(existingOrder); + + } +} + + diff --git a/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordController.java b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordController.java new file mode 100644 index 0000000..693a0ce --- /dev/null +++ b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordController.java @@ -0,0 +1,40 @@ +package ethniconnect_backend.Resetpassword; + +import ethniconnect_backend.UserCredentials.UserCredentials; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.view.RedirectView; +@CrossOrigin() +@RestController +@RequestMapping(path = "api/v1") +@AllArgsConstructor +public class ResetPasswordController { + + @Autowired + ResetPasswordService resetPasswordService; + + @PostMapping(path="resetpassword") + public void restpassword(@RequestBody ResetPasswordRequest resetPasswordRequest) + { + resetPasswordService.resetPassword(resetPasswordRequest); + } + + @GetMapping(path = "/resetpassword/confirm") + public RedirectView confirm(@RequestParam("token") String token) { + String email=resetPasswordService.confirmToken(token); + RedirectView redirectView = new RedirectView(); + String redirectUrl = "https://fullstackdeveloper.guru?email="+email; + redirectView.setUrl(redirectUrl); + + return redirectView; + } + + @PutMapping(path="updatepassword") + public String updatepassword(@RequestBody UpdatePassword updatePassword) + { + resetPasswordService.updatePassword(updatePassword); + return "Updated Password"; + } + +} diff --git a/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordRequest.java b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordRequest.java new file mode 100644 index 0000000..cfb2b87 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordRequest.java @@ -0,0 +1,20 @@ +package ethniconnect_backend.Resetpassword; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Getter +@EqualsAndHashCode +@ToString +@Setter +public class ResetPasswordRequest { + + private String emailId; + @JsonCreator + ResetPasswordRequest(@JsonProperty("emailId") String emailId) { + this.emailId = emailId; + } + + +} diff --git a/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordService.java b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordService.java new file mode 100644 index 0000000..6bc52e4 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Resetpassword/ResetPasswordService.java @@ -0,0 +1,74 @@ +package ethniconnect_backend.Resetpassword; + +import ethniconnect_backend.UserCredentials.UserCredentialsRepository; +import ethniconnect_backend.UserCredentials.UserCredentialsService; +import ethniconnect_backend.UserCredentials.UserCredentials; +import ethniconnect_backend.email.EmailSender; +import ethniconnect_backend.email.EmailService; +import ethniconnect_backend.ChefSignup.token.ConfirmationToken; +import ethniconnect_backend.ChefSignup.token.ConfirmationTokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +public class ResetPasswordService { + + @Autowired + UserCredentialsService userCredentialsService; + @Autowired + UserCredentialsRepository userCredentialsRepository; + @Autowired + EmailSender emailSender; + @Autowired + EmailService emailService; + @Autowired + ConfirmationTokenService confirmationTokenService; + + public void resetPassword(ResetPasswordRequest resetPasswordRequest) { + UserCredentials userCredentials = userCredentialsRepository.findByEmail(resetPasswordRequest.getEmailId()).get(); + + if(userCredentialsService.isEmailIdExist(resetPasswordRequest.getEmailId())) + { + String token = userCredentialsService.getToken(userCredentials); + String link = "http://localhost:5000/api/v1/resetpassword/confirm?token=" + token; + emailSender.send( + resetPasswordRequest.getEmailId(), + emailService.buildResetPasswordEmail("User", link)); + } + + } + + @Transactional + public String confirmToken(String token) { + ConfirmationToken confirmationToken = confirmationTokenService + .getToken(token) + .orElseThrow(() -> + new IllegalStateException("token not found")); + + if (confirmationToken.getConfirmedAt() != null) { + throw new IllegalStateException("email already confirmed"); + } + + LocalDateTime expiredAt = confirmationToken.getExpiresAt(); + + if (expiredAt.isBefore(LocalDateTime.now())) { + throw new IllegalStateException("token expired"); + } + + confirmationTokenService.setConfirmedAt(token); + + return confirmationToken.getAppUser().getEmail(); + } + public void updatePassword(UpdatePassword updatePassword) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + String encodedPassword = passwordEncoder.encode(updatePassword.getNewPwd()); + UserCredentials userCredentials = userCredentialsRepository.findByEmail(updatePassword.getEmailId()).get(); + userCredentials.setPassword(encodedPassword); + userCredentials.setResetpasswordtoken(null); + userCredentialsRepository.save(userCredentials); + } +} diff --git a/src/main/java/ethniconnect_backend/Resetpassword/UpdatePassword.java b/src/main/java/ethniconnect_backend/Resetpassword/UpdatePassword.java new file mode 100644 index 0000000..e0ce6b2 --- /dev/null +++ b/src/main/java/ethniconnect_backend/Resetpassword/UpdatePassword.java @@ -0,0 +1,15 @@ +package ethniconnect_backend.Resetpassword; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@EqualsAndHashCode +@ToString +@Setter +public class UpdatePassword { + private String emailId; + private String newPwd; +} diff --git a/src/main/java/com/example/demo/appuser/AppUser.java b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentials.java similarity index 70% rename from src/main/java/com/example/demo/appuser/AppUser.java rename to src/main/java/ethniconnect_backend/UserCredentials/UserCredentials.java index 793a3ef..ae5754a 100644 --- a/src/main/java/com/example/demo/appuser/AppUser.java +++ b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentials.java @@ -1,4 +1,4 @@ -package com.example.demo.appuser; +package ethniconnect_backend.UserCredentials; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -17,36 +17,34 @@ @EqualsAndHashCode @NoArgsConstructor @Entity -public class AppUser implements UserDetails { +public class UserCredentials implements UserDetails { @SequenceGenerator( - name = "student_sequence", - sequenceName = "student_sequence", + name = "chef_sequence", + sequenceName = "chef_sequence", allocationSize = 1 ) @Id @GeneratedValue( strategy = GenerationType.SEQUENCE, - generator = "student_sequence" + generator = "chef_sequence" ) + private Long id; - private String firstName; - private String lastName; private String email; private String password; @Enumerated(EnumType.STRING) - private AppUserRole appUserRole; + private UserRole appUserRole; + private String resetpasswordtoken; private Boolean locked = false; private Boolean enabled = false; - public AppUser(String firstName, - String lastName, - String email, - String password, - AppUserRole appUserRole) { - this.firstName = firstName; - this.lastName = lastName; + public UserCredentials( + String email, + String password, + UserRole appUserRole) { + this.email = email; this.password = password; this.appUserRole = appUserRole; @@ -69,13 +67,6 @@ public String getUsername() { return email; } - public String getFirstName() { - return firstName; - } - - public String getLastName() { - return lastName; - } @Override public boolean isAccountNonExpired() { diff --git a/src/main/java/com/example/demo/appuser/AppUserRepository.java b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsRepository.java similarity index 61% rename from src/main/java/com/example/demo/appuser/AppUserRepository.java rename to src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsRepository.java index d8eaa8f..5180985 100644 --- a/src/main/java/com/example/demo/appuser/AppUserRepository.java +++ b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsRepository.java @@ -1,4 +1,4 @@ -package com.example.demo.appuser; +package ethniconnect_backend.UserCredentials; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -10,15 +10,18 @@ @Repository @Transactional(readOnly = true) -public interface AppUserRepository - extends JpaRepository { +public interface UserCredentialsRepository + extends JpaRepository { - Optional findByEmail(String email); + Optional findByEmail(String email); + public UserCredentials findByResetpasswordtoken(String token); @Transactional @Modifying - @Query("UPDATE AppUser a " + + @Query("UPDATE UserCredentials a " + "SET a.enabled = TRUE WHERE a.email = ?1") int enableAppUser(String email); + + } diff --git a/src/main/java/com/example/demo/appuser/AppUserService.java b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsService.java similarity index 51% rename from src/main/java/com/example/demo/appuser/AppUserService.java rename to src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsService.java index aa23eb5..e621047 100644 --- a/src/main/java/com/example/demo/appuser/AppUserService.java +++ b/src/main/java/ethniconnect_backend/UserCredentials/UserCredentialsService.java @@ -1,28 +1,37 @@ -package com.example.demo.appuser; +package ethniconnect_backend.UserCredentials; -import com.example.demo.registration.token.ConfirmationToken; -import com.example.demo.registration.token.ConfirmationTokenService; +import ethniconnect_backend.ChefSignup.token.ConfirmationToken; +import ethniconnect_backend.ChefSignup.token.ConfirmationTokenService; import lombok.AllArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Optional; import java.util.UUID; - +@Transactional @Service @AllArgsConstructor -public class AppUserService implements UserDetailsService { +public class UserCredentialsService implements UserDetailsService { private final static String USER_NOT_FOUND_MSG = "user with email %s not found"; - private final AppUserRepository appUserRepository; + private final UserCredentialsRepository appUserRepository; private final BCryptPasswordEncoder bCryptPasswordEncoder; private final ConfirmationTokenService confirmationTokenService; + public boolean isEmailIdExist(String emailId) + { + if(appUserRepository.findByEmail(emailId).isPresent()) + return true; + return false; + } + @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { @@ -32,25 +41,48 @@ public UserDetails loadUserByUsername(String email) String.format(USER_NOT_FOUND_MSG, email))); } - public String signUpUser(AppUser appUser) { + public String signUpUser(UserCredentials inputUser) { + + Optional existingUserCredentials = appUserRepository.findByEmail(inputUser.getEmail()); boolean userExists = appUserRepository - .findByEmail(appUser.getEmail()) + .findByEmail(inputUser.getEmail()) .isPresent(); - if (userExists) { + if (existingUserCredentials.isPresent() ) { // TODO check of attributes are the same and // TODO if email not confirmed send confirmation email. - - throw new IllegalStateException("email already taken"); + if(existingUserCredentials.get().isEnabled()) + { + throw new IllegalStateException("email already taken"); + } } + else + { + existingUserCredentials= Optional.of(inputUser); + } + + + String encodedPassword = bCryptPasswordEncoder + .encode(inputUser.getPassword()); + + if(!existingUserCredentials.isPresent()) + { + + } + existingUserCredentials.get().setPassword(encodedPassword); + existingUserCredentials.get().setEmail(inputUser.getEmail()); - String encodedPassword = bCryptPasswordEncoder - .encode(appUser.getPassword()); - appUser.setPassword(encodedPassword); + appUserRepository.save(existingUserCredentials.get()); - appUserRepository.save(appUser); + String token = getToken(existingUserCredentials.get()); +// TODO: SEND EMAIL + + return token; + } + + public String getToken(UserCredentials appUser) { String token = UUID.randomUUID().toString(); ConfirmationToken confirmationToken = new ConfirmationToken( @@ -62,13 +94,12 @@ public String signUpUser(AppUser appUser) { confirmationTokenService.saveConfirmationToken( confirmationToken); - -// TODO: SEND EMAIL - return token; } public int enableAppUser(String email) { return appUserRepository.enableAppUser(email); } + + } diff --git a/src/main/java/ethniconnect_backend/UserCredentials/UserRole.java b/src/main/java/ethniconnect_backend/UserCredentials/UserRole.java new file mode 100644 index 0000000..087751e --- /dev/null +++ b/src/main/java/ethniconnect_backend/UserCredentials/UserRole.java @@ -0,0 +1,7 @@ +package ethniconnect_backend.UserCredentials; + +public enum UserRole { + PERSONAL, + ADMIN, + BUSINESS +} diff --git a/src/main/java/com/example/demo/email/EmailSender.java b/src/main/java/ethniconnect_backend/email/EmailSender.java similarity index 67% rename from src/main/java/com/example/demo/email/EmailSender.java rename to src/main/java/ethniconnect_backend/email/EmailSender.java index 3b2c58b..a57c2d0 100644 --- a/src/main/java/com/example/demo/email/EmailSender.java +++ b/src/main/java/ethniconnect_backend/email/EmailSender.java @@ -1,4 +1,4 @@ -package com.example.demo.email; +package ethniconnect_backend.email; public interface EmailSender { void send(String to, String email); diff --git a/src/main/java/ethniconnect_backend/email/EmailService.java b/src/main/java/ethniconnect_backend/email/EmailService.java new file mode 100644 index 0000000..25da61b --- /dev/null +++ b/src/main/java/ethniconnect_backend/email/EmailService.java @@ -0,0 +1,249 @@ +package ethniconnect_backend.email; + +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; + +@Service +@AllArgsConstructor +public class EmailService implements EmailSender{ + + private final static Logger LOGGER = LoggerFactory + .getLogger(EmailService.class); + + private final JavaMailSender mailSender; + public String buildContactEmail(String message,String useremailid) { + return "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " Contact Request from User\n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "


\n" + + " \n" + + "

Hi Admin,

You received an contact request from "+useremailid+"

\n

Message : "+message+"

" + + " \n" + + + " \n" + + "


\n" + + "\n" + + "
"; + } + + public String buildEmail(String name, String link) { + return "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " Confirm your email\n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "


\n" + + " \n" + + "

Hi " + name + ",

Thank you for registering to Ethniconnect. Please click on the below link to activate your account:

Activate Now

\n Link will expire in 15 minutes.

See you soon

" + + " \n" + + "


\n" + + "\n" + + "
"; + } + + + public String buildResetPasswordEmail(String name, String link) { + return "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " Reset Password\n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "


\n" + + " \n" + + "

Hi " + name + ",

Please click on the below link to reset your password:

Reset Password

\n Link will expire in 15 minutes.

See you soon

" + + " \n" + + "


\n" + + "\n" + + "
"; + } + + @Override + @Async + public void send(String to, String email) { + try { + MimeMessage mimeMessage = mailSender.createMimeMessage(); + MimeMessageHelper helper = + new MimeMessageHelper(mimeMessage, "utf-8"); + helper.setText(email, true); + helper.setTo(to); + helper.setSubject("Confirm your email"); + helper.setFrom("ethniconnect@gmail.com"); + mailSender.send(mimeMessage); + } catch (MessagingException e) { + LOGGER.error("failed to send email", e); + throw new IllegalStateException("failed to send email"); + } + } +} diff --git a/src/main/java/com/example/demo/security/PasswordEncoder.java b/src/main/java/ethniconnect_backend/security/PasswordEncoder.java similarity index 90% rename from src/main/java/com/example/demo/security/PasswordEncoder.java rename to src/main/java/ethniconnect_backend/security/PasswordEncoder.java index b4f4291..dfb329b 100644 --- a/src/main/java/com/example/demo/security/PasswordEncoder.java +++ b/src/main/java/ethniconnect_backend/security/PasswordEncoder.java @@ -1,4 +1,4 @@ -package com.example.demo.security; +package ethniconnect_backend.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/example/demo/security/config/WebSecurityConfig.java b/src/main/java/ethniconnect_backend/security/config/WebSecurityConfig.java similarity index 88% rename from src/main/java/com/example/demo/security/config/WebSecurityConfig.java rename to src/main/java/ethniconnect_backend/security/config/WebSecurityConfig.java index 72b110d..9ad8142 100644 --- a/src/main/java/com/example/demo/security/config/WebSecurityConfig.java +++ b/src/main/java/ethniconnect_backend/security/config/WebSecurityConfig.java @@ -1,6 +1,6 @@ -package com.example.demo.security.config; +package ethniconnect_backend.security.config; -import com.example.demo.appuser.AppUserService; +import ethniconnect_backend.UserCredentials.UserCredentialsService; import lombok.AllArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,7 +16,7 @@ @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - private final AppUserService appUserService; + private final UserCredentialsService appUserService; private final BCryptPasswordEncoder bCryptPasswordEncoder; @Override @@ -24,7 +24,7 @@ protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() - .antMatchers("/api/v*/registration/**") + .antMatchers("/**") .permitAll() .anyRequest() .authenticated().and() diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c270e3e..aa4e801 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,27 +1,46 @@ server: + port: 8080 error: include-message: always include-binding-errors: always + + + spring: datasource: - password: - url: jdbc:postgresql://localhost:5432/registration - username: + driver-class-name: com.mysql.cj.jdbc.Driver + password: bharani16 + initialization-mode: ALWAYS + url: jdbc:mysql://localhost:3306/ethniconnect?serverTimezone=UTC + #url: jdbc:mysql://ethniconnectdb.cs03gfixeofo.us-east-2.rds.amazonaws.com:3306/ethniconnect + username: root jpa: hibernate: ddl-auto: create-drop properties: hibernate: - dialect: org.hibernate.dialect.PostgreSQLDialect + dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true show-sql: true + # mail: + # host: smtp.gmail.com + # port: 587 + #username: + #password: + #properties: + #mail: + #smtp: + #auth: true + #starttls: + #enable: true mail: - host: localhost - port: 1025 - username: hello - password: hello + host: smtp.gmail.com + port: 587 + username: ethniconnect@gmail.com + password: nftvtqgflwntjipb + properties: mail: @@ -35,3 +54,7 @@ spring: timeout: 3000 writetimeout: 5000 + servlet : + multipart : + max-file-size: 15MB + max-request-size: 15MB diff --git a/src/test/java/com/example/demo/DemoApplicationTests.java b/src/test/java/ethniconnect_backend/DemoApplicationTests.java similarity index 85% rename from src/test/java/com/example/demo/DemoApplicationTests.java rename to src/test/java/ethniconnect_backend/DemoApplicationTests.java index 2778a6a..fa62e2c 100644 --- a/src/test/java/com/example/demo/DemoApplicationTests.java +++ b/src/test/java/ethniconnect_backend/DemoApplicationTests.java @@ -1,4 +1,4 @@ -package com.example.demo; +package ethniconnect_backend; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;