From 3a39cbee1181b5897ca9c7b734197e78b4d99d73 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 10 Mar 2024 22:23:20 +0100 Subject: [PATCH 1/2] Storage System --- .../b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png | Bin 0 -> 11586 bytes .../Clyde/EndPoints/StorageController.java | 30 +++++++ .../Clyde/EndPoints/UserController.java | 2 +- .../Clyde/Repositories/FileRepository.java | 9 ++ .../Clyde/Services/StorageService.java | 78 ++++++++++++++++++ .../herisson/Clyde/Tables/StorageFile.java | 51 ++++++++++++ .../java/ovh/herisson/Clyde/Tables/User.java | 3 +- 7 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png create mode 100644 backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java diff --git a/backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png b/backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad7d033c5618af21cd4e6c19c36845a03aafb81 GIT binary patch literal 11586 zcmeAS@N?(olHy`uVBq!ia0y~yU}a)pV7kn~#=yYfD^q`zfq_9G*(1o8fuTy3fuW(9 zf#K(W28M>03=E|P3=FRl7#OT(FffScPl`Y4#=yY9mgMd3!tfsi7wla=nSp_Uv%n*= zn1O*?7=#%aX3ddcV9=@aba4!+xb^mKbkCgckv~2@pL_UR)%o4usvf_6cHvn<0iR0d zEU~2v1XLG!K5SAtB`W0Ps`038QQU${-CnM`D}qEicXx12RazwGGFz#Uhl{=a!UUG- zb3(3X3aOXPIgMh1oh{w^FWpjH4&SI3JeW{~`wym?R|tuO`# z2K$&mk-*hg7X__!*?zm%ZL#3nvfD`v4UI}HObiG31GJ_-dNw=1FFJp(sowrSpCTe6 zI{cOkKP|GHHhuczwcGD?eSUua_^n$}d%j%q{`lwf`Qy)?Ej!A{V86A+f#F8#s;gOV z?(et1^|s7Js&~cp*BiHPO*Q;r*4x{A^y~F_`Taj<@0XPSdBXkCrqg=eK`TX`7FjCo zljhLRFp=80cdzX8^Yi=D=hvF;``DX*@l{=YHIIzE&@9-_K_tC0Z!GAp%T{2@Q9v-|zkSpqc;JzS`eO85tUGZf^VDXD)qzHOK7nm6gGTkB)R&l)Z`g z^Su6Fx{PI!ir-wT)QJLu-|rOr|M?pKzx2)h{r}bXUHkT}Y>r*6mEHfJ=a0w#IU0ZD z+qZ43%nZ|GES2nXc^M2Ox)ybGbi91|^2gr$zxV$5^W0uOJgzeJ&CSi~ZEbC3|9E?Ts5Y6a=md*PEW4 zm8JD=&*yU;9Tr7TI#ih%rq59ad25Q-(iLH=KZe(T4gdIh|G(GP?{$8A>geemJ8t)F zl6T_ET0vrs? zNjW(>c{`s@n|E%<`+dJbse4;a(9O;1{_)RZ>i>Qff9jIN&>%k@r1a6J)B628ckY~b zZbgXJNACR}xC6Czx+?UaJb7~8nVECv_TIc1$<5B7Ct3cJ!9d~J^XJJ)NsFErzuWzO z-;PhGv~}l*oO)Ws!^`_MHEi?Ep0L%aFBuM~Dzh*hXvo-pySB0@v#M&B{z1V_FH5X0 zzAe*bV%U+=;=mvwpslT4TRHvaty@thQoP*l-D~dVxi7!Gk%QsEBta&|1P2qT-hD1D zi!@psE@f=Ly>aKxo6{qem6ZcmU)7O?nK9K%_14?6^Uq6m$NK9|Jaz1tTl_N}9i1Py zY#9nXIU5-a6wb}H7C(LZv>2oK&6UB+ld`i{KQBIZ?AW6V3!TOI7-Eb-QPKg*-mBN| zyY<;JJf_g~%$YM07MV8xempMx^5WvYGrz9J|Gm1s^o4(*NT5jT|6+!QZZ8g&2F8nd z+mj0mH$E@sld%v8k1d_rI{Dbi$?A{m|9`LlZS=*|jrEU$5Q1Z|!#$CWe?Cu-Cno3awtf`r}gl z+Lg~YXKjtDdEqSI6?AeflcmY*vlg|#O5)RGtx7yNSQzv;%fB-iC}>Ufa;f>=ayd@B zOR4VP^LjfscX!=+B2v9>GL}V4^f%}2c*v$Gz_3FF9La0Lw3YV#UU#5u_ub2pu7NIV z!-^9aGfQ^gt$4HX_@av$Uuwd3#`M+x{uXJ)aG@ORBERLrg5V--+qP?;D}R4`E6n8i z^vcTMTFyp6!QbEC|DX6@dcHj@gtpv%tI?%2um0c9AKUAHZ=ZL5_p4Q_!LjQv0zVN|X+IGI9l< zo}8Skal`xa<;#IP-=Iw%;dil6!H`SP-CA(TqViLU&F?pxZRZECzG{=p&G2O| zD7;o&e);8T=Yd5Uk9NIY*Il$T=jD=ucXxJHyjr=u%5Hhk$|I@MW78f≪T()yt*( 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 WV_;yo6bxF{%;4$j=d#Wzp$PzngwB8f literal 0 HcmV?d00001 diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java new file mode 100644 index 0000000..21fabcc --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java @@ -0,0 +1,30 @@ +package ovh.herisson.Clyde.EndPoints; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import ovh.herisson.Clyde.Services.StorageService; +import org.springframework.core.io.Resource; + +@RestController +public class StorageController { + + private final StorageService storageServ; + + public StorageController(StorageService storageServ){ + this.storageServ= storageServ; + } + + + @PostMapping("/upload") + public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) { + + String path = storageServ.store(file); + + if (path == null) return new ResponseEntity<>("issue with the file storage", HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(path, HttpStatus.OK); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index ba54926..1656d21 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -31,7 +31,7 @@ public class UserController { return new ResponseEntity<>(user, HttpStatus.OK); } - @PostMapping("/user") + @PostMapping("/user") //todo check role public ResponseEntity postUser(@RequestBody User user){ userService.save(user); return new ResponseEntity(String.format("Account created with ID:%s",user.getRegNo()),HttpStatus.CREATED); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java new file mode 100644 index 0000000..2240c92 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java @@ -0,0 +1,9 @@ +package ovh.herisson.Clyde.Repositories; + +import org.springframework.data.repository.CrudRepository; + +import ovh.herisson.Clyde.Tables.StorageFile; + + +public interface FileRepository extends CrudRepository { +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java new file mode 100644 index 0000000..1fc9b65 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java @@ -0,0 +1,78 @@ +package ovh.herisson.Clyde.Services; + +import org.springframework.core.io.UrlResource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import ovh.herisson.Clyde.Repositories.FileRepository; +import ovh.herisson.Clyde.Tables.StorageFile; +import java.io.IOException; +import org.springframework.core.io.Resource; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Objects; +import java.util.UUID; + +@Service +public class StorageService { + + + private final Path rootLocation = Paths.get("cdn/"); + private final FileRepository fileRepo; + + public StorageService(FileRepository filerepo){ + this.fileRepo = filerepo; + } + + + public String store(MultipartFile file) { + UUID uuid = UUID.randomUUID(); + String stringUuid = uuid.toString() + "." + file.getContentType().split("/",2)[1]; + + try { + if (file.isEmpty()) { + return null; + } + + Path destinationFile = this.rootLocation.resolve(Paths.get(stringUuid)).toAbsolutePath(); + + if (!destinationFile.getParent().equals(this.rootLocation.toAbsolutePath())) { + return null;} + + Files.copy(file.getInputStream(), destinationFile,StandardCopyOption.REPLACE_EXISTING); + } + catch (IOException e) { + e.printStackTrace(); + return null; + } + + String url = this.rootLocation.resolve(Paths.get(Objects.requireNonNull(stringUuid))) + .normalize().toAbsolutePath().toString(); + System.out.println(url); + fileRepo.save(new StorageFile(file.getName(),url)); + + return url; + } + + public Path load(String filename) { + return rootLocation.resolve(filename); + } + + public Resource loadAsResource(String filename) { + try { + Path file = load(filename); + Resource resource = new UrlResource(file.toUri()); + if (resource.exists() || resource.isReadable()) { + return resource; + } + else {return null; + } + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java new file mode 100644 index 0000000..97c1d30 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java @@ -0,0 +1,51 @@ +package ovh.herisson.Clyde.Tables; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + + +@Entity +public class StorageFile { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + private String url; + + public StorageFile(String name, String url){ + this.name = name; + this.url = url; + } + + public StorageFile(){} + + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java index 95467a4..0752014 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java @@ -23,7 +23,8 @@ public class User { private String profilePictureUrl; private ovh.herisson.Clyde.Tables.Role role; private String password; - public User(String lastName, String firstName, String email, String address, String country, Date birthDate, String profilePictureUrl, Role role, String password){ + public User(String lastName, String firstName, String email, String address, + String country, Date birthDate, String profilePictureUrl, Role role, String password){ this.lastName = lastName; this.firstName = firstName; this.email = email; -- 2.52.0 From 7766299eb7586b72b9a3370e23509523cc0be0c3 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Mon, 11 Mar 2024 17:03:33 +0100 Subject: [PATCH 2/2] correction anthoniesque --- .../b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png | Bin 11586 -> 0 bytes .../Clyde/EndPoints/StorageController.java | 8 ++-- .../Clyde/Services/StorageService.java | 42 +++++------------- .../ovh/herisson/Clyde/Tables/FileType.java | 8 ++++ .../herisson/Clyde/Tables/StorageFile.java | 14 +++++- .../java/ovh/herisson/Clyde/Tables/User.java | 3 +- 6 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java diff --git a/backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png b/backend/cdn/b97fdd51-c4a7-4c13-b70c-4b91eb0b3179.png deleted file mode 100644 index 0ad7d033c5618af21cd4e6c19c36845a03aafb81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11586 zcmeAS@N?(olHy`uVBq!ia0y~yU}a)pV7kn~#=yYfD^q`zfq_9G*(1o8fuTy3fuW(9 zf#K(W28M>03=E|P3=FRl7#OT(FffScPl`Y4#=yY9mgMd3!tfsi7wla=nSp_Uv%n*= zn1O*?7=#%aX3ddcV9=@aba4!+xb^mKbkCgckv~2@pL_UR)%o4usvf_6cHvn<0iR0d zEU~2v1XLG!K5SAtB`W0Ps`038QQU${-CnM`D}qEicXx12RazwGGFz#Uhl{=a!UUG- zb3(3X3aOXPIgMh1oh{w^FWpjH4&SI3JeW{~`wym?R|tuO`# z2K$&mk-*hg7X__!*?zm%ZL#3nvfD`v4UI}HObiG31GJ_-dNw=1FFJp(sowrSpCTe6 zI{cOkKP|GHHhuczwcGD?eSUua_^n$}d%j%q{`lwf`Qy)?Ej!A{V86A+f#F8#s;gOV z?(et1^|s7Js&~cp*BiHPO*Q;r*4x{A^y~F_`Taj<@0XPSdBXkCrqg=eK`TX`7FjCo zljhLRFp=80cdzX8^Yi=D=hvF;``DX*@l{=YHIIzE&@9-_K_tC0Z!GAp%T{2@Q9v-|zkSpqc;JzS`eO85tUGZf^VDXD)qzHOK7nm6gGTkB)R&l)Z`g z^Su6Fx{PI!ir-wT)QJLu-|rOr|M?pKzx2)h{r}bXUHkT}Y>r*6mEHfJ=a0w#IU0ZD z+qZ43%nZ|GES2nXc^M2Ox)ybGbi91|^2gr$zxV$5^W0uOJgzeJ&CSi~ZEbC3|9E?Ts5Y6a=md*PEW4 zm8JD=&*yU;9Tr7TI#ih%rq59ad25Q-(iLH=KZe(T4gdIh|G(GP?{$8A>geemJ8t)F zl6T_ET0vrs? zNjW(>c{`s@n|E%<`+dJbse4;a(9O;1{_)RZ>i>Qff9jIN&>%k@r1a6J)B628ckY~b zZbgXJNACR}xC6Czx+?UaJb7~8nVECv_TIc1$<5B7Ct3cJ!9d~J^XJJ)NsFErzuWzO z-;PhGv~}l*oO)Ws!^`_MHEi?Ep0L%aFBuM~Dzh*hXvo-pySB0@v#M&B{z1V_FH5X0 zzAe*bV%U+=;=mvwpslT4TRHvaty@thQoP*l-D~dVxi7!Gk%QsEBta&|1P2qT-hD1D zi!@psE@f=Ly>aKxo6{qem6ZcmU)7O?nK9K%_14?6^Uq6m$NK9|Jaz1tTl_N}9i1Py zY#9nXIU5-a6wb}H7C(LZv>2oK&6UB+ld`i{KQBIZ?AW6V3!TOI7-Eb-QPKg*-mBN| zyY<;JJf_g~%$YM07MV8xempMx^5WvYGrz9J|Gm1s^o4(*NT5jT|6+!QZZ8g&2F8nd z+mj0mH$E@sld%v8k1d_rI{Dbi$?A{m|9`LlZS=*|jrEU$5Q1Z|!#$CWe?Cu-Cno3awtf`r}gl z+Lg~YXKjtDdEqSI6?AeflcmY*vlg|#O5)RGtx7yNSQzv;%fB-iC}>Ufa;f>=ayd@B zOR4VP^LjfscX!=+B2v9>GL}V4^f%}2c*v$Gz_3FF9La0Lw3YV#UU#5u_ub2pu7NIV z!-^9aGfQ^gt$4HX_@av$Uuwd3#`M+x{uXJ)aG@ORBERLrg5V--+qP?;D}R4`E6n8i z^vcTMTFyp6!QbEC|DX6@dcHj@gtpv%tI?%2um0c9AKUAHZ=ZL5_p4Q_!LjQv0zVN|X+IGI9l< zo}8Skal`xa<;#IP-=Iw%;dil6!H`SP-CA(TqViLU&F?pxZRZECzG{=p&G2O| zD7;o&e);8T=Yd5Uk9NIY*Il$T=jD=ucXxJHyjr=u%5Hhk$|I@MW78f≪T()yt*( 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 WV_;yo6bxF{%;4$j=d#Wzp$PzngwB8f diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java index 21fabcc..2a36657 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java @@ -7,8 +7,10 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import ovh.herisson.Clyde.Services.StorageService; import org.springframework.core.io.Resource; +import ovh.herisson.Clyde.Tables.FileType; @RestController +@CrossOrigin(origins = "http://localhost:5173") public class StorageController { private final StorageService storageServ; @@ -18,10 +20,10 @@ public class StorageController { } - @PostMapping("/upload") - public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) { + @PostMapping("/upload/{fileType}") + public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file, @PathVariable FileType fileType) { - String path = storageServ.store(file); + String path = storageServ.store(file,fileType); if (path == null) return new ResponseEntity<>("issue with the file storage", HttpStatus.BAD_REQUEST); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java index 1fc9b65..77dff70 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java @@ -4,6 +4,7 @@ import org.springframework.core.io.UrlResource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import ovh.herisson.Clyde.Repositories.FileRepository; +import ovh.herisson.Clyde.Tables.FileType; import ovh.herisson.Clyde.Tables.StorageFile; import java.io.IOException; import org.springframework.core.io.Resource; @@ -26,53 +27,30 @@ public class StorageService { } - public String store(MultipartFile file) { - UUID uuid = UUID.randomUUID(); - String stringUuid = uuid.toString() + "." + file.getContentType().split("/",2)[1]; + public String store(MultipartFile file, FileType fileType) { + if (file.getOriginalFilename().isEmpty()){return null;} + + UUID uuid = UUID.randomUUID(); + String stringUuid = uuid + "." + file.getOriginalFilename().split("\\.",2)[1]; try { if (file.isEmpty()) { return null; } - Path destinationFile = this.rootLocation.resolve(Paths.get(stringUuid)).toAbsolutePath(); - - if (!destinationFile.getParent().equals(this.rootLocation.toAbsolutePath())) { - return null;} + Path destinationFile = this.rootLocation.resolve(Paths.get(stringUuid)); Files.copy(file.getInputStream(), destinationFile,StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { - e.printStackTrace(); return null; } String url = this.rootLocation.resolve(Paths.get(Objects.requireNonNull(stringUuid))) - .normalize().toAbsolutePath().toString(); - System.out.println(url); - fileRepo.save(new StorageFile(file.getName(),url)); + .normalize().toString(); + + fileRepo.save(new StorageFile(file.getName(),url, fileType)); return url; } - - public Path load(String filename) { - return rootLocation.resolve(filename); - } - - public Resource loadAsResource(String filename) { - try { - Path file = load(filename); - Resource resource = new UrlResource(file.toUri()); - if (resource.exists() || resource.isReadable()) { - return resource; - } - else {return null; - } - } - catch (Exception e) { - e.printStackTrace(); - return null; - } - } - } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java new file mode 100644 index 0000000..18ce1be --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java @@ -0,0 +1,8 @@ +package ovh.herisson.Clyde.Tables; + +public enum FileType { + + ProfilePicture, + + EducationCertificate +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java index 97c1d30..a96d0ec 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java @@ -17,9 +17,13 @@ public class StorageFile { private String url; - public StorageFile(String name, String url){ + private FileType fileType; + + + public StorageFile(String name, String url, FileType fileType){ this.name = name; this.url = url; + this.fileType = fileType; } public StorageFile(){} @@ -48,4 +52,12 @@ public class StorageFile { public void setUrl(String url) { this.url = url; } + + public FileType getFileType() { + return fileType; + } + + public void setFileType(FileType fileType) { + this.fileType = fileType; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java index 0752014..101ec9e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java @@ -24,7 +24,8 @@ public class User { private ovh.herisson.Clyde.Tables.Role role; private String password; public User(String lastName, String firstName, String email, String address, - String country, Date birthDate, String profilePictureUrl, Role role, String password){ + String country, Date birthDate, String profilePictureUrl, Role role, String password) + { this.lastName = lastName; this.firstName = firstName; this.email = email; -- 2.52.0