diff --git a/README.md b/README.md index af03c84..66ec943 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Chancellor Galiza Project 🚀 +# Midterm exam Project 🚀 This Spring Boot Application contains five end points : diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..949f55b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,62 @@ + + + + + + Document + + + + + +
+
+
+

Spring Boot Project

+

Java Endpoint Testing

+
+
+
+ +
+
+ +
+
+

Enter your details

+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+

+
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/index.js b/frontend/index.js new file mode 100644 index 0000000..a0d4ea4 --- /dev/null +++ b/frontend/index.js @@ -0,0 +1,58 @@ +document.getElementById('validationForm').addEventListener('submit', async function(event) { + event.preventDefault(); + + const email = document.getElementById('email').value; + const fullName = document.getElementById('full-name').value; + const message = document.getElementById('message'); + const form = document.getElementById('validationForm'); + // Clear previous results + message.innerHTML = ''; + + // Create Fragment + const messageFragment = document.createDocumentFragment(''); + + const local = 'http://localhost' + const port = '8080' + const success = true + + try { + const first = document.getElementById('first') + const last = document.getElementById('last') + const nameMessage = document.getElementById('name-message'); + // Parse name + const nameResponse = await fetch(`${local}:${port}/parse/name?name=${fullName}`); + const parsedName = await nameResponse.json(); + console.log(parsedName); + + if (parsedName.error) { + message.innerHTML += `

Error parsing name: ${parsedName.error}

`; + } else { + first.value = parsedName.first + last.value = parsedName.last + } + } catch (error) { + message.innerHTML += `

Error: ${error.message}

`; + success = false + } + + try { + // Validate email + const emailResponse = await fetch(`${local}:${port}/validate/email?email=${email}`); + const isEmailValid = await emailResponse.json(); + console.log(isEmailValid) + + if (!isEmailValid) { + message.innerHTML += `

Email is invalid.

`; + } else { + message.innerHTML += `

Email is valid.

`; + } + } catch (error) { + message.innerHTML += `

Error: ${error.message}

`; + success = false + } + + if (success) { + alert('Success') + } + +}); \ No newline at end of file diff --git a/pom.xml b/pom.xml index ac3fad4..5883a9d 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 0.0.1-SNAPSHOT midterm midterm - + diff --git a/src/main/java/com/example/midterm/ConcreteNameService.java b/src/main/java/com/example/midterm/ConcreteNameService.java index 2008297..f9c1003 100644 --- a/src/main/java/com/example/midterm/ConcreteNameService.java +++ b/src/main/java/com/example/midterm/ConcreteNameService.java @@ -4,10 +4,18 @@ import org.springframework.stereotype.Component; import service.NameService; +import utility.NameBuilder; + @Component public class ConcreteNameService implements NameService { @Override public Name process(String name) throws Exception { - return null; + + String[] fullName = new NameBuilder().process(name); + Name res_name = new Name(); + res_name.setFirst(fullName[0]); + res_name.setLast(fullName[1]); + + return res_name; } } diff --git a/src/main/java/com/example/midterm/ParseController.java b/src/main/java/com/example/midterm/ParseController.java new file mode 100644 index 0000000..04c25e3 --- /dev/null +++ b/src/main/java/com/example/midterm/ParseController.java @@ -0,0 +1,33 @@ +package com.example.midterm; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import service.NameService; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("parse") +public class ParseController { + + @CrossOrigin(origins = "*") + @GetMapping("/name") + public ResponseEntity processName(@RequestParam String name) { + NameService nameService = new ConcreteNameService(); + try { + return ResponseEntity.ok(nameService.process(name)); + } catch (Exception e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("name", name); + errorResponse.put("error", "supplied name can't be parsed"); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/midterm/ValidateController.java b/src/main/java/com/example/midterm/ValidateController.java new file mode 100644 index 0000000..788eb1f --- /dev/null +++ b/src/main/java/com/example/midterm/ValidateController.java @@ -0,0 +1,26 @@ +package com.example.midterm; + + +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RestController +@RequestMapping("validate") +public class ValidateController { + public static final Pattern VALID_EMAIL_ADDRESS_REGEX = + Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE); + + @CrossOrigin(origins = "*") + @GetMapping("/email") + public boolean validateEmail(@RequestParam String email) { + Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(email); + return matcher.matches(); + } + +} diff --git a/src/main/java/utility/NameBuilder.java b/src/main/java/utility/NameBuilder.java index 68a4035..e018d92 100644 --- a/src/main/java/utility/NameBuilder.java +++ b/src/main/java/utility/NameBuilder.java @@ -38,10 +38,14 @@ public String[] process(String name) { log.debug("Check if clean string [{}] is from list of suffixes [{}]", o, (Object) suffix ); if(i==0 || first==null) { first = convertName(o); - }else { - if(last==null) { + } else { + if (last==null) { last = convertName(o); - } + } else if (last.equals("Del")) { + last = last + " " + convertName(o); + } else if (convertName(o).trim().equals("Del")) { + last = convertName(o); + } } } } @@ -60,6 +64,14 @@ public String[] process(String name) { } private String convertName(String inputString) { + if (inputString.trim().equals("APC")) { + return "APC"; + } + + if (inputString.trim().substring(0,2).equals("de")) { + return inputString.trim(); + } + log.debug("Converting name [{}] to Proper Case",inputString ); if (inputString.length() == 1) { diff --git a/src/test/java/com/example/midterm/MidtermApplicationTests.java b/src/test/java/com/example/midterm/MidtermApplicationTests.java index c3a06da..16067d5 100644 --- a/src/test/java/com/example/midterm/MidtermApplicationTests.java +++ b/src/test/java/com/example/midterm/MidtermApplicationTests.java @@ -53,7 +53,7 @@ public void remove() throws Exception { nameService.process("APC User - Bsc")); assertEquals("APC User | Bsc", new Name("APC", "User"), nameService.process("APC User | Bsc")); - assertEquals("~~~ APC User ~~~", new Name("APC", "User"), + assertEquals("~~ ~APC User ~~~", new Name("APC", "User"), nameService.process("~~~ APC User ~~~")); assertEquals("APC User Certified Professional", new Name("APC", "User"), nameService.process("APC User Certified Professional")); diff --git a/target/classes/com/example/midterm/ConcreteNameService.class b/target/classes/com/example/midterm/ConcreteNameService.class index fd057f3..5db9d9a 100644 Binary files a/target/classes/com/example/midterm/ConcreteNameService.class and b/target/classes/com/example/midterm/ConcreteNameService.class differ diff --git a/target/classes/com/example/midterm/MidtermApplication.class b/target/classes/com/example/midterm/MidtermApplication.class index ea5eaf7..6d1aee7 100644 Binary files a/target/classes/com/example/midterm/MidtermApplication.class and b/target/classes/com/example/midterm/MidtermApplication.class differ diff --git a/target/classes/com/example/midterm/MyController.class b/target/classes/com/example/midterm/MyController.class new file mode 100644 index 0000000..a8c83cb Binary files /dev/null and b/target/classes/com/example/midterm/MyController.class differ diff --git a/target/classes/com/example/midterm/ParseController.class b/target/classes/com/example/midterm/ParseController.class new file mode 100644 index 0000000..a742bbd Binary files /dev/null and b/target/classes/com/example/midterm/ParseController.class differ diff --git a/target/classes/dto/Name.class b/target/classes/dto/Name.class index d361cf4..01c10e2 100644 Binary files a/target/classes/dto/Name.class and b/target/classes/dto/Name.class differ diff --git a/target/classes/service/NameService.class b/target/classes/service/NameService.class index 45d2233..aff96bd 100644 Binary files a/target/classes/service/NameService.class and b/target/classes/service/NameService.class differ diff --git a/target/classes/utility/NameBuilder.class b/target/classes/utility/NameBuilder.class index 00c9bdd..ce5c4bb 100644 Binary files a/target/classes/utility/NameBuilder.class and b/target/classes/utility/NameBuilder.class differ diff --git a/target/test-classes/com/example/midterm/MidtermApplicationTests.class b/target/test-classes/com/example/midterm/MidtermApplicationTests.class index ee68d5a..cdd4d4e 100644 Binary files a/target/test-classes/com/example/midterm/MidtermApplicationTests.class and b/target/test-classes/com/example/midterm/MidtermApplicationTests.class differ