Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
timtech-profile
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pull-resource
timtech-profile
Commits
c12f8cc5
Commit
c12f8cc5
authored
Dec 29, 2023
by
Syed Asif
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
profile poc added
parent
6ed90cf0
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
473 additions
and
17 deletions
+473
-17
pom.xml
pom.xml
+30
-17
TimtechProfileApplication.java
...n/java/com/timtech/profile/TimtechProfileApplication.java
+13
-0
MongoConfig.java
src/main/java/com/timtech/profile/config/MongoConfig.java
+24
-0
ProfileController.java
...ava/com/timtech/profile/controller/ProfileController.java
+58
-0
ProfileDto.java
src/main/java/com/timtech/profile/dto/ProfileDto.java
+58
-0
Profile.java
src/main/java/com/timtech/profile/entity/Profile.java
+37
-0
BusinessException.java
...java/com/timtech/profile/exception/BusinessException.java
+25
-0
ProfileRepository.java
...ava/com/timtech/profile/repository/ProfileRepository.java
+18
-0
ProfileService.java
...main/java/com/timtech/profile/service/ProfileService.java
+21
-0
ProfileServiceImpl.java
.../com/timtech/profile/service/impl/ProfileServiceImpl.java
+121
-0
Utils.java
src/main/java/com/timtech/profile/util/Utils.java
+53
-0
application.properties
src/main/resources/application.properties
+2
-0
TimtechProfileApplicationTests.java
...a/com/timtech/profile/TimtechProfileApplicationTests.java
+13
-0
No files found.
pom.xml
View file @
c12f8cc5
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http
s
://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
com.example
</groupId>
<artifactId>
demo
</artifactId>
<version>
0.0.1-SNAPSHOT
</version>
<packaging>
jar
</packaging>
<name>
demo
</name>
<description>
Demo project for Spring Boot
</description>
<parent>
<parent>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
2.
0.1
.RELEASE
</version>
<version>
2.
3.3
.RELEASE
</version>
<relativePath/>
<!-- lookup parent from repository -->
<relativePath/>
<!-- lookup parent from repository -->
</parent>
</parent>
<groupId>
com.timtech
</groupId>
<artifactId>
timtech-profile
</artifactId>
<version>
0.0.1-SNAPSHOT
</version>
<name>
timtech-profile
</name>
<description>
Tim Tech Profile
</description>
<properties>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
<java.version>
1.8
</java.version>
<java.version>
1.8
</java.version>
</properties>
</properties>
<dependencies>
<dependencies>
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
<artifactId>
spring-boot-starter-data-mongodb-reactive
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-webflux
</artifactId>
</dependency>
</dependency>
<dependency>
<dependency>
...
@@ -35,6 +31,24 @@
...
@@ -35,6 +31,24 @@
<artifactId>
spring-boot-starter-test
</artifactId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
<scope>
test
</scope>
</dependency>
</dependency>
<dependency>
<groupId>
io.projectreactor
</groupId>
<artifactId>
reactor-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-validation
</artifactId>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
...
@@ -46,5 +60,4 @@
...
@@ -46,5 +60,4 @@
</plugins>
</plugins>
</build>
</build>
</project>
</project>
src/main/java/com/timtech/profile/TimtechProfileApplication.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
@SpringBootApplication
public
class
TimtechProfileApplication
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
TimtechProfileApplication
.
class
,
args
);
}
}
src/main/java/com/timtech/profile/config/MongoConfig.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
config
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration
;
import
org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories
;
import
com.mongodb.reactivestreams.client.MongoClient
;
import
com.mongodb.reactivestreams.client.MongoClients
;
@Configuration
@EnableReactiveMongoRepositories
(
basePackages
=
"com.timtech.profile"
)
public
class
MongoConfig
extends
AbstractReactiveMongoConfiguration
{
@Override
protected
String
getDatabaseName
()
{
return
"profiles"
;
}
@Override
public
MongoClient
reactiveMongoClient
()
{
return
MongoClients
.
create
();
}
}
src/main/java/com/timtech/profile/controller/ProfileController.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
controller
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.DeleteMapping
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PutMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseStatus
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.timtech.profile.dto.ProfileDto
;
import
com.timtech.profile.dto.ProfileDto.ProfileUpdate
;
import
com.timtech.profile.service.ProfileService
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
@RestController
@RequestMapping
(
"/profile"
)
public
class
ProfileController
{
@Autowired
private
ProfileService
profileService
;
@PostMapping
@ResponseStatus
(
HttpStatus
.
CREATED
)
public
Mono
<
ProfileDto
>
saveProfile
(
@RequestBody
ProfileDto
profileDto
)
{
return
profileService
.
save
(
profileDto
);
}
@PutMapping
@ResponseStatus
(
HttpStatus
.
ACCEPTED
)
public
Mono
<
ProfileDto
>
updateProfile
(
@Validated
(
ProfileUpdate
.
class
)
@RequestBody
ProfileDto
profileDto
)
{
return
profileService
.
update
(
profileDto
);
}
@GetMapping
public
Flux
<
ProfileDto
>
findAllProfiles
(){
return
profileService
.
findAll
();
}
@GetMapping
(
"/{profileId}"
)
public
Mono
<
ProfileDto
>
findOneProfiles
(
@PathVariable
String
profileId
){
return
profileService
.
findOne
(
profileId
);
}
@DeleteMapping
(
"/{profileId}"
)
public
Mono
<
String
>
deleteOne
(
@PathVariable
String
profileId
){
return
profileService
.
deleteOne
(
profileId
);
}
}
src/main/java/com/timtech/profile/dto/ProfileDto.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
dto
;
import
java.io.Serializable
;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.Pattern
;
import
javax.validation.constraints.Size
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public
class
ProfileDto
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@NotNull
(
message
=
"Id must not be null"
,
groups
=
ProfileUpdate
.
class
)
private
String
profileId
;
@NotNull
(
message
=
"First Name is Mandatory"
)
@Pattern
(
regexp
=
"^[a-zA-Z]+$"
,
message
=
"First Name should only contain alphabets and spaces"
)
private
String
firstName
;
@NotNull
(
message
=
"Last Name is Mandatory"
)
@Pattern
(
regexp
=
"^[a-zA-Z]+$"
,
message
=
"Last Name should only contain alphabets and spaces"
)
private
String
lastName
;
@NotNull
(
message
=
"Date of Birth is Mandatory"
)
@Pattern
(
regexp
=
"^\\d{2}-\\d{2}-\\d{4}$"
,
message
=
"Date of Birth should be in MM-DD-YYYY format"
)
private
String
dateOfBirth
;
// @Pattern(regexp = "^[A-Z]{5}\\d{4}[A-Z]$", message = "Invalid PAN format")
@Pattern
(
regexp
=
"[A-Z]{5}[0-9]{4}[A-Z]{1}"
,
message
=
"Invalid PAN format"
)
private
String
permanentAccountNumber
;
@Size
(
min
=
12
,
max
=
12
,
message
=
"Aadhar Number should be a 12-digit number"
)
// @Pattern(regexp = "^[1-9]\\d{11}$", message = "Aadhar Number should not start with 0")
@Pattern
(
regexp
=
"^[2-9]\\d{1}[0-9]\\d{10}$"
,
message
=
"Aadhar Number should not start with 0"
)
private
String
adharNumber
;
@NotBlank
(
message
=
"Mobile Number is mandatory"
)
@Pattern
(
regexp
=
"^[6-9]\\d{9}$"
,
message
=
"Mobile Number should be 10-digit number starting with 6/7/8/9"
)
private
String
mobileNumber
;
private
String
status
;
public
interface
ProfileCreate
{}
public
interface
ProfileUpdate
{}
}
src/main/java/com/timtech/profile/entity/Profile.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
entity
;
import
java.io.Serializable
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.mongodb.core.index.Indexed
;
import
org.springframework.data.mongodb.core.mapping.Document
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.ToString
;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document
(
collection
=
"profile"
)
public
class
Profile
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@Id
private
String
profileId
;
private
String
firstName
;
private
String
lastName
;
private
String
dateOfBirth
;
@Indexed
(
unique
=
true
)
private
String
permanentAccountNumber
;
@Indexed
(
unique
=
true
)
private
String
adharNumber
;
private
String
mobileNumber
;
private
String
status
;
}
src/main/java/com/timtech/profile/exception/BusinessException.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
exception
;
import
org.springframework.http.HttpStatus
;
public
class
BusinessException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
1L
;
private
final
HttpStatus
status
;
private
final
String
message
;
public
BusinessException
(
HttpStatus
status
,
String
message
)
{
this
.
status
=
status
;
this
.
message
=
message
;
}
public
HttpStatus
getStatus
()
{
return
status
;
}
@Override
public
String
getMessage
()
{
return
message
;
}
}
src/main/java/com/timtech/profile/repository/ProfileRepository.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
repository
;
import
org.springframework.data.mongodb.repository.ReactiveMongoRepository
;
import
com.timtech.profile.entity.Profile
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
public
interface
ProfileRepository
extends
ReactiveMongoRepository
<
Profile
,
String
>
{
Flux
<
Profile
>
findByStatus
(
String
profileStatus
);
Mono
<
Boolean
>
existsByPermanentAccountNumber
(
String
permanentAccountNumber
);
Mono
<
Boolean
>
existsByAdharNumber
(
String
adharNumber
);
}
src/main/java/com/timtech/profile/service/ProfileService.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
service
;
import
com.timtech.profile.dto.ProfileDto
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
public
interface
ProfileService
{
Mono
<
ProfileDto
>
save
(
ProfileDto
profileDto
);
Mono
<
ProfileDto
>
update
(
ProfileDto
profileDto
);
Flux
<
ProfileDto
>
findAll
();
Mono
<
ProfileDto
>
findOne
(
String
profileId
);
Mono
<
String
>
deleteOne
(
String
profileId
);
}
src/main/java/com/timtech/profile/service/impl/ProfileServiceImpl.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
service
.
impl
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.dao.DuplicateKeyException
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.server.ResponseStatusException
;
import
com.timtech.profile.dto.ProfileDto
;
import
com.timtech.profile.entity.Profile
;
import
com.timtech.profile.exception.BusinessException
;
import
com.timtech.profile.repository.ProfileRepository
;
import
com.timtech.profile.service.ProfileService
;
import
com.timtech.profile.util.Utils
;
import
lombok.extern.slf4j.Slf4j
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
@Service
@Slf4j
public
class
ProfileServiceImpl
implements
ProfileService
{
@Autowired
private
ProfileRepository
profileRepository
;
@Transactional
public
Mono
<
ProfileDto
>
save
(
ProfileDto
profileDto
)
{
log
.
debug
(
"Request to save Profile "
+
profileDto
);
if
(
profileDto
==
null
)
{
return
Mono
.
error
(
new
RuntimeException
(
"Profile Should Not be NULL"
));
}
boolean
isValidPan
=
Utils
.
builder
().
build
().
isValidPanCard
(
profileDto
.
getPermanentAccountNumber
());
boolean
isValidAadhar
=
Utils
.
builder
().
build
().
isValidAadhar
(
profileDto
.
getAdharNumber
());
if
(
isValidPan
||
isValidAadhar
)
{
return
profileRepository
.
existsByPermanentAccountNumber
(
profileDto
.
getPermanentAccountNumber
())
.
zipWith
(
profileRepository
.
existsByAdharNumber
(
profileDto
.
getAdharNumber
())).
flatMap
(
tuple
->
{
if
(
tuple
.
getT1
()
||
tuple
.
getT2
())
{
return
Mono
.
error
(
new
ResponseStatusException
(
HttpStatus
.
CONFLICT
,
"Duplicate PAN or Aadhar Number"
));
}
else
{
Profile
profileSave
=
new
Profile
();
profileDto
.
setStatus
(
"ACTIVE"
);
BeanUtils
.
copyProperties
(
profileDto
,
profileSave
);
return
profileRepository
.
save
(
profileSave
).
map
(
this
::
convertProfileToDto
);
}
})
.
onErrorResume
(
DuplicateKeyException
.
class
,
ex
->
Mono
.
error
(
new
ResponseStatusException
(
HttpStatus
.
CONFLICT
,
"Duplicate PAN or Aadhar Number"
)))
.
onErrorResume
(
ex
->
Mono
.
error
(
new
BusinessException
(
HttpStatus
.
INTERNAL_SERVER_ERROR
,
"Internal Server Error !!!"
)));
}
else
{
return
Mono
.
error
(
new
BusinessException
(
HttpStatus
.
BAD_REQUEST
,
"Invalid PAN or Aadhar Number"
));
}
}
@Transactional
public
Mono
<
ProfileDto
>
update
(
ProfileDto
profileDto
)
{
log
.
debug
(
"Request to update profile "
+
profileDto
);
if
(
profileDto
==
null
)
{
return
Mono
.
error
(
new
RuntimeException
(
"Profile Should Not be NULL"
));
}
return
findOne
(
profileDto
.
getProfileId
()).
flatMap
(
existingProfileDto
->
{
if
(
"ACTIVE"
.
equals
(
existingProfileDto
.
getStatus
()))
{
Profile
profile
=
convertDtoToProfile
(
existingProfileDto
);
profile
.
setStatus
(
"IN-ACTIVE"
);
return
profileRepository
.
save
(
profile
).
map
(
this
::
convertProfileToDto
)
.
onErrorMap
(
DuplicateKeyException
.
class
,
ex
->
{
throw
new
RuntimeException
(
"Duplicate PAN or Aadhar Number"
);
});
}
else
{
return
Mono
.
error
(
new
RuntimeException
(
"Profile has been Deleted !!!"
));
}
});
}
@Transactional
(
readOnly
=
true
)
public
Flux
<
ProfileDto
>
findAll
()
{
log
.
debug
(
"Request to find all profiles "
);
return
profileRepository
.
findByStatus
(
"ACTIVE"
).
map
(
this
::
convertProfileToDto
);
}
@Transactional
(
readOnly
=
true
)
public
Mono
<
ProfileDto
>
findOne
(
String
profileId
)
{
log
.
debug
(
"Request to find one profile "
);
return
profileRepository
.
findById
(
profileId
).
map
(
this
::
convertProfileToDto
);
}
@Transactional
public
Mono
<
String
>
deleteOne
(
String
profileId
)
{
log
.
debug
(
"Request to delete one profile "
);
return
findOne
(
profileId
).
flatMap
(
profileDto
->
{
Profile
profile
=
convertDtoToProfile
(
profileDto
);
profile
.
setStatus
(
"IN-ACTIVE"
);
return
profileRepository
.
save
(
profile
);
}).
flatMap
(
savedProfile
->
Mono
.
just
(
"SUCCESS"
)).
onErrorResume
(
throwable
->
Mono
.
just
(
"FAILURE"
));
}
private
ProfileDto
convertProfileToDto
(
Profile
profile
)
{
ProfileDto
profileDto
=
ProfileDto
.
builder
().
build
();
BeanUtils
.
copyProperties
(
profile
,
profileDto
);
return
profileDto
;
}
private
Profile
convertDtoToProfile
(
ProfileDto
profileDto
)
{
Profile
profile
=
Profile
.
builder
().
build
();
BeanUtils
.
copyProperties
(
profileDto
,
profile
);
return
profile
;
}
}
src/main/java/com/timtech/profile/util/Utils.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
.
util
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
lombok.Builder
;
@Builder
public
class
Utils
{
public
boolean
isValidPanCard
(
String
panCardNo
)
{
String
regex
=
"[A-Z]{5}[0-9]{4}[A-Z]{1}"
;
Pattern
p
=
Pattern
.
compile
(
regex
);
if
(
panCardNo
==
null
)
{
return
false
;
}
Matcher
m
=
p
.
matcher
(
panCardNo
);
return
m
.
matches
();
}
public
boolean
isValidAadhar
(
String
adhar
)
{
String
regex
=
"[1-9]{12}"
;
Pattern
p
=
Pattern
.
compile
(
regex
);
if
(
adhar
==
null
)
{
return
false
;
}
Matcher
m
=
p
.
matcher
(
adhar
);
return
m
.
matches
();
}
// public static void main(String[] args) {
//
// boolean validAadhar = Utils.builder().build().isValidAadhar("011234567891");
// System.out.println(validAadhar);
//
// }
}
src/main/resources/application.properties
View file @
c12f8cc5
server.port
=
9091
spring.data.mongodb.uri
=
mongodb://localhost:27017/profiles
src/test/java/com/timtech/profile/TimtechProfileApplicationTests.java
0 → 100644
View file @
c12f8cc5
package
com
.
timtech
.
profile
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
class
TimtechProfileApplicationTests
{
@Test
void
contextLoads
()
{
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment