From e90d1e3d9e77fd6b8d16d2af2a3d31d2c9c236f5 Mon Sep 17 00:00:00 2001 From: Bivash Yadav Date: Wed, 21 Jul 2021 14:56:10 -0500 Subject: [PATCH 1/5] removed password field --- mms-frontend/src/pages/AppInstall.js | 78 ++-------------------------- 1 file changed, 4 insertions(+), 74 deletions(-) diff --git a/mms-frontend/src/pages/AppInstall.js b/mms-frontend/src/pages/AppInstall.js index 283157a..a9945d7 100644 --- a/mms-frontend/src/pages/AppInstall.js +++ b/mms-frontend/src/pages/AppInstall.js @@ -12,16 +12,11 @@ export class AppInstall extends Component { email:"", phone:"", description:"", - password:"", - confirmPassword:"", valid:false, error:{ emailError:false, eamilErrorDesc:"Email*", - passwordError:false, - passwordErrorDesc:"", - confirmPasswordError:false, - confirmPasswordErrorDesc:"" + } }; @@ -53,41 +48,7 @@ export class AppInstall extends Component { } } - else if(e.target.name === "password") - { - - if(validator.isLength(e.target.value, 8, 15) && validator.isStrongPassword(e.target.value)) - { - errors["passwordErrorDesc"]=""; - errors["passwordError"]=false; - this.setState({error:errors}) - - } - else - { - errors["passwordErrorDesc"]="Password should be the combination of atleast 1 lowercase letter, 1 uppercase letter, 1 number and 1 symbol and has length of atleast 8-15 characters."; - errors["passwordError"] = true; - this.setState({error:errors}) - - } - } - else if(e.target.name === "confirmPassword") - { - if(validator.equals(e.target.value, this.state.password)) - { - errors["confirmPasswordErrorDesc"]=""; - errors["confirmPasswordError"]=false; - this.setState({error:errors}) - - } - else - { - errors["confirmPasswordErrorDesc"]="Password didn't match"; - errors["confirmPasswordError"] = true; - this.setState({error:errors}) - - } - } + this.setState({ valid: !(this.state.error.emailError || this.state.error.passwordError || this.state.error.confirmPasswordError || !validator.isLength(this.state.name1, 1,50) || !validator.isLength(this.state.address, 1, 200) || ! validator.isLength(this.state.description, 1, 10000)) }); @@ -172,40 +133,9 @@ export class AppInstall extends Component { /> -
+ - this.change(e)} - - /> - -
- -
- {this.state.error.passwordErrorDesc} - -
- - -
- this.change(e)} - - /> - -
+
{this.state.error.confirmPasswordErrorDesc} From 53a40cd638917e52fb3f11106be3349bba2d3133 Mon Sep 17 00:00:00 2001 From: Bivash Yadav Date: Wed, 21 Jul 2021 15:16:27 -0500 Subject: [PATCH 2/5] Added database table --- src/main/resources/schema-postgres.sql | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/schema-postgres.sql b/src/main/resources/schema-postgres.sql index 4005ce0..b8bac90 100644 --- a/src/main/resources/schema-postgres.sql +++ b/src/main/resources/schema-postgres.sql @@ -23,4 +23,16 @@ INSERT INTO mms_user(username, password, email_address) VALUES('warsaw', '174800 INSERT INTO mms_user(username, password, email_address) VALUES('losangeles', '3971000xyz', 'la@europe.eu'); INSERT INTO mms_user(username, password, email_address) VALUES('newyork', '855000xyz0', 'ny@europe.eu'); INSERT INTO mms_user(username, password, email_address) VALUES('edinburgh', '464000xyz', 'edinburgh@europe.eu'); -INSERT INTO mms_user(username, password, email_address) VALUES('berlin', '671000xyz', 'berlin@europe.eu'); \ No newline at end of file +INSERT INTO mms_user(username, password, email_address) VALUES('berlin', '671000xyz', 'berlin@europe.eu'); + +DROP TABLE IF EXISTS organizations; +CREATE TABLE organizations ( + id serial PRIMARY KEY, + name VARCHAR(255) NOT NULL, + address VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + ph_number VARCHAR(255) NOT NULL, + description VARCHAR(1000) NOT NULL, + created_ts TIMESTAMP WITH TIME ZONE, + updated_ts TIMESTAMP WITH TIME ZONE +); \ No newline at end of file From 566b4cf092a2bf0011251cf70561f5a810fc851b Mon Sep 17 00:00:00 2001 From: Bivash Yadav Date: Fri, 23 Jul 2021 17:22:53 -0500 Subject: [PATCH 3/5] Added api call using Axios --- mms-frontend/src/pages/AppInstall.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mms-frontend/src/pages/AppInstall.js b/mms-frontend/src/pages/AppInstall.js index a9945d7..fd7608b 100644 --- a/mms-frontend/src/pages/AppInstall.js +++ b/mms-frontend/src/pages/AppInstall.js @@ -1,6 +1,7 @@ import React, { Component } from 'react' import { Grid,Paper,Typography,Button, TextField } from '@material-ui/core' import validator from 'validator'; +import axios from 'axios'; export class AppInstall extends Component { constructor(props) { @@ -61,6 +62,20 @@ export class AppInstall extends Component { submitfunction=()=> { //var valid = this.handleValidation(); + const orgObject = { + orgName: this.state.name1, + address: this.state.address, + email: this.state.email, + phone_no: this.state.phone, + description: this.state.description + } + axios.post('/org/', orgObject) + .then((res) => { + console.log(res); + }).catch((error) => { + console.log(error) + }); + //this.setState({ username: '', email: '', password: '' }) console.log(this.state) } From 70e93eec328b4c0fd94b6f44c29234a6acaf4957 Mon Sep 17 00:00:00 2001 From: Bivash Yadav Date: Fri, 23 Jul 2021 17:25:43 -0500 Subject: [PATCH 4/5] api for organization setup page --- .../com/memeor/mms/beans/Organization.java | 81 ++++++++++++++++++ .../OrganizationRegistrationResponse.java | 15 ++++ .../controller/OrganizationController.java | 52 ++++++++++++ .../repository/OrganizationRepository.java | 18 ++++ .../mms/service/OrganizationService.java | 18 ++++ .../service/impl/OrganizationServiceImpl.java | 82 +++++++++++++++++++ 6 files changed, 266 insertions(+) create mode 100644 src/main/java/com/memeor/mms/beans/Organization.java create mode 100644 src/main/java/com/memeor/mms/beans/OrganizationRegistrationResponse.java create mode 100644 src/main/java/com/memeor/mms/controller/OrganizationController.java create mode 100644 src/main/java/com/memeor/mms/repository/OrganizationRepository.java create mode 100644 src/main/java/com/memeor/mms/service/OrganizationService.java create mode 100644 src/main/java/com/memeor/mms/service/impl/OrganizationServiceImpl.java diff --git a/src/main/java/com/memeor/mms/beans/Organization.java b/src/main/java/com/memeor/mms/beans/Organization.java new file mode 100644 index 0000000..3ee0567 --- /dev/null +++ b/src/main/java/com/memeor/mms/beans/Organization.java @@ -0,0 +1,81 @@ +package com.memeor.mms.beans; + +import java.util.Date; +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.validation.constraints.NotBlank; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity(name = "organizations") +@Table(name = "organizations") +@RequiredArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class Organization { + + @Id + @SequenceGenerator(name = "mms_org_id_seq", sequenceName = "mms_org_id_seq", allocationSize = 1) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mms_org_id_seq") + private Integer id; + + @NotBlank + @Column(name = "name", unique= true) + private String orgName; + + @NotBlank + @Column(name = "address") + private String address; + + @NotBlank + @Column(name = "email", unique = true) + private String email; + + @NotBlank + @Column(name = "ph_number") + private String phone_no; + + @NotBlank + @Column(name = "description") + private String description; + + @Column(name = "created_ts", updatable = false, columnDefinition= "TIMESTAMP WITH TIME ZONE") + @JsonFormat(pattern = "yyyy-MM-dd@HH:mm:ss") + @Temporal(TemporalType.TIMESTAMP) + private Date createdTS; + + @Column(name = "updated_ts", updatable = false, columnDefinition= "TIMESTAMP WITH TIME ZONE") + @JsonFormat(pattern = "yyyy-MM-dd@HH:mm:ss") + @Temporal(TemporalType.TIMESTAMP) + private Date updatedTS; + + @PrePersist + protected void onCreate() { + this.createdTS = new Date(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedTS = new Date(); + } + +} diff --git a/src/main/java/com/memeor/mms/beans/OrganizationRegistrationResponse.java b/src/main/java/com/memeor/mms/beans/OrganizationRegistrationResponse.java new file mode 100644 index 0000000..3f74f3c --- /dev/null +++ b/src/main/java/com/memeor/mms/beans/OrganizationRegistrationResponse.java @@ -0,0 +1,15 @@ +package com.memeor.mms.beans; + +import org.springframework.stereotype.Component; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Component +public class OrganizationRegistrationResponse { + private RegistrationStatus status; + private String message; + +} diff --git a/src/main/java/com/memeor/mms/controller/OrganizationController.java b/src/main/java/com/memeor/mms/controller/OrganizationController.java new file mode 100644 index 0000000..551099b --- /dev/null +++ b/src/main/java/com/memeor/mms/controller/OrganizationController.java @@ -0,0 +1,52 @@ +package com.memeor.mms.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.memeor.mms.beans.Organization; +import com.memeor.mms.service.OrganizationService; +import com.memeor.mms.beans.OrganizationRegistrationResponse; +import com.memeor.mms.beans.RegistrationStatus; + +import java.util.List; + +@RestController +@RequestMapping("/org") +public class OrganizationController { + + @Autowired + OrganizationService organizationService; + + + + //get all organizations + //Note: should be able to access by super admin only in future + @GetMapping("") + public List getAllOrganization(){ + + return organizationService.getAllOrganizations(); + + + } + + //Register a new organization + @PostMapping("") + public ResponseEntity addOrganization(@RequestBody Organization organization){ + OrganizationRegistrationResponse organizationRegistrationResponse = organizationService.saveOrganization(organization); + if(organizationRegistrationResponse.getStatus().equals(RegistrationStatus.ACCEPTED)) + return new ResponseEntity<>(organizationRegistrationResponse, HttpStatus.ACCEPTED); + else + return new ResponseEntity<>(organizationRegistrationResponse, HttpStatus.CONFLICT); + + + + } + + +} diff --git a/src/main/java/com/memeor/mms/repository/OrganizationRepository.java b/src/main/java/com/memeor/mms/repository/OrganizationRepository.java new file mode 100644 index 0000000..2a842ef --- /dev/null +++ b/src/main/java/com/memeor/mms/repository/OrganizationRepository.java @@ -0,0 +1,18 @@ +package com.memeor.mms.repository; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.memeor.mms.beans.Organization; + +@Repository +public interface OrganizationRepository extends CrudRepository{ + + @Query("select count(*) = 1 from organizations where name = :orgName") + public Boolean checkIfNameAlreadyUsed(String orgName); + + @Query("select count(*) =1 from organizations where email = :emailAddress") + public Boolean checkIfEmailAlreadyUsed( String emailAddress); + +} diff --git a/src/main/java/com/memeor/mms/service/OrganizationService.java b/src/main/java/com/memeor/mms/service/OrganizationService.java new file mode 100644 index 0000000..f76397e --- /dev/null +++ b/src/main/java/com/memeor/mms/service/OrganizationService.java @@ -0,0 +1,18 @@ +package com.memeor.mms.service; + +import com.memeor.mms.beans.Organization; +import com.memeor.mms.beans.OrganizationRegistrationResponse; +import java.util.List; + + +public interface OrganizationService { + public List getAllOrganizations(); + + public OrganizationRegistrationResponse saveOrganization(Organization organization); + + public boolean checkIfEmailAlreadyUsed(String emailAddress); + + public boolean checkIfNameAlreadyUsed(String orgName); + + +} diff --git a/src/main/java/com/memeor/mms/service/impl/OrganizationServiceImpl.java b/src/main/java/com/memeor/mms/service/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..328d34c --- /dev/null +++ b/src/main/java/com/memeor/mms/service/impl/OrganizationServiceImpl.java @@ -0,0 +1,82 @@ +package com.memeor.mms.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.memeor.mms.beans.OrganizationRegistrationResponse; +import com.memeor.mms.beans.RegistrationStatus; +import com.memeor.mms.repository.OrganizationRepository; +import com.memeor.mms.service.OrganizationService; +import com.memeor.mms.beans.Organization; + +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +public class OrganizationServiceImpl implements OrganizationService{ + + @Autowired + OrganizationRepository organizationRepository; + + @Autowired + OrganizationRegistrationResponse organizationRegistrationResponse; + + @Override + public List getAllOrganizations(){ + List result = new ArrayList(); + organizationRepository.findAll().forEach(result::add); + + return result; + } + + @Override + public OrganizationRegistrationResponse saveOrganization(Organization organization) { + // TODO Auto-generated method stub + boolean emailExists = checkIfEmailAlreadyUsed(organization.getEmail()); + boolean nameExists = checkIfNameAlreadyUsed(organization.getOrgName()); + + try { + if(!emailExists) { + if(!nameExists) { + organizationRepository.save(organization); + organizationRegistrationResponse.setStatus(RegistrationStatus.ACCEPTED); + } + else { + organizationRegistrationResponse.setStatus(RegistrationStatus.FAILED); + } + } + else { + if(!nameExists) { + organizationRegistrationResponse.setStatus(RegistrationStatus.ACCEPTED); + } + else { + organizationRegistrationResponse.setStatus(RegistrationStatus.FAILED); + + } + } + + + + }catch(Exception e) { + log.info("Error in database when trying to insert "+ organization.toString()); + } + + return organizationRegistrationResponse; + //TODO: send email + } + + @Override + public boolean checkIfEmailAlreadyUsed(String orgName) { + // TODO Auto-generated method stub + return organizationRepository.checkIfNameAlreadyUsed(orgName); + } + + @Override + public boolean checkIfNameAlreadyUsed(String emailAddress) { + // TODO Auto-generated method stub + return organizationRepository.checkIfEmailAlreadyUsed(emailAddress); + } +} From 07bec96a009c0b384d128bd43f1fc29537a785e1 Mon Sep 17 00:00:00 2001 From: Bivash Yadav Date: Fri, 23 Jul 2021 17:26:52 -0500 Subject: [PATCH 5/5] changes in database table for organization --- src/main/resources/schema-postgres.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/schema-postgres.sql b/src/main/resources/schema-postgres.sql index b8bac90..956e0e1 100644 --- a/src/main/resources/schema-postgres.sql +++ b/src/main/resources/schema-postgres.sql @@ -35,4 +35,6 @@ CREATE TABLE organizations ( description VARCHAR(1000) NOT NULL, created_ts TIMESTAMP WITH TIME ZONE, updated_ts TIMESTAMP WITH TIME ZONE -); \ No newline at end of file +); + +INSERT INTO organizations(name, address, email, ph_number, description) VALUES('Fitness Nation Gym', '512 Lamar Blvd', 'fitness@gmail.com', '68226679**', 'It is the best gym in Arlington'); \ No newline at end of file