From c2941757cd2ce36ed704b6d3eb1f177d61c78124 Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Mon, 29 Jul 2024 09:45:08 +0530
Subject: [PATCH 01/11] configure docker compose
---
auth-service/pom.xml | 66 +++++--
.../authservice/AuthServiceApplication.java | 2 +
.../resources/application-docker.properties | 25 +++
.../resources/application-kube.properties | 30 +++
.../src/main/resources/application.properties | 14 +-
ca.crt | Bin 0 -> 2226 bytes
config/alfresco-global.properties | 10 +
config/solrcore.properties | 6 +
dms-mediator/dms-mediator-all/pom.xml | 24 +++
.../resources/application-docker.properties | 35 ++++
.../resources/application-kube.properties | 40 ++++
dms-mediator/dms-mediator-dao/pom.xml | 35 ++--
dms-mediator/dms-mediator-service/pom.xml | 21 +-
dms-mediator/pom.xml | 47 +++--
docker-compose.yml | 182 ++++++++++++++++++
eureka-server/pom.xml | 40 +++-
.../resources/application-docker.properties | 11 ++
k8s/minikube/bootstrap/postgres/configmap.yml | 13 ++
k8s/minikube/bootstrap/postgres/service.yml | 15 ++
.../bootstrap/postgres/statefulset.yml | 45 +++++
k8s/minikube/bootstrap/postgres/volume.yml | 37 ++++
.../services/auth-service/deployment.yml | 33 ++++
.../services/auth-service/service.yml | 16 ++
.../services/dms-mediator/deployment.yml | 33 ++++
.../services/dms-mediator/service.yml | 16 ++
.../services/lms-gateway/deployment.yml | 31 +++
k8s/minikube/services/lms-gateway/service.yml | 15 ++
.../services/payment-service/deployment.yml | 31 +++
.../services/payment-service/service.yml | 15 ++
.../resource-management/deployment.yml | 31 +++
.../services/resource-management/service.yml | 15 ++
lib-common/pom.xml | 18 +-
lib-global/pom.xml | 35 +---
lib-security/pom.xml | 83 --------
.../config/JwtAuthenticationFilter.java | 69 -------
.../main/java/com/itgura/util/JwtService.java | 20 --
.../java/com/itgura/util/JwtServiceImpl.java | 81 --------
.../entity-field-validation.properties | 4 -
.../static-field-validation.properties | 3 -
.../src/main/resources/swagger.properties | 15 --
lms-gateway/pom.xml | 38 +++-
.../resources/application-docker.properties | 88 +++++++++
.../resources/application-kube.properties | 93 +++++++++
.../src/main/resources/application.yml | 23 ---
payment-service/pom.xml | 61 ++++--
.../service/impl/PaymentServiceImpl.java | 2 +
.../resources/application-docker.properties | 30 +++
.../resources/application-kube.properties | 34 ++++
.../src/main/resources/application.properties | 2 +-
pom.xml | 116 +++++++++++
resource-management/pom.xml | 35 +++-
.../resource-management-all/pom.xml | 25 ++-
.../resources/application-docker.properties | 23 ++-
.../resources/application-kube.properties | 45 +++++
.../resource-management-dao/pom.xml | 5 +-
.../main/resources/application-dev.properties | 2 +-
.../resource-management-service/pom.xml | 5 +-
.../itgura/service/impl/ClassServiceImpl.java | 1 -
.../.mvn/wrapper/maven-wrapper.properties | 2 -
user-management/pom.xml | 49 -----
user-management/user-management-all/pom.xml | 42 ----
.../src/main/java/com/itgura/UserMain.java | 16 --
.../itgura/config/SecurityConfiguration.java | 58 ------
.../itgura/controller/sampleController.java | 4 -
.../src/main/resources/application.properties | 4 -
user-management/user-management-dao/pom.xml | 57 ------
.../dto/request/AuthenticationRequest.java | 15 --
.../itgura/dto/request/RegisterRequest.java | 18 --
.../dto/response/AuthenticationResponse.java | 15 --
.../src/main/java/com/itgura/entity/User.java | 68 -------
.../src/main/java/com/itgura/enums/Role.java | 6 -
.../com/itgura/repository/UserRepository.java | 19 --
.../resources/application-prod.properties | 26 ---
.../user-management-service/pom.xml | 29 ---
.../itgura/service/AuthenticationService.java | 11 --
.../impl/AuthenticationServiceImpl.java | 95 ---------
76 files changed, 1458 insertions(+), 966 deletions(-)
create mode 100644 auth-service/src/main/resources/application-docker.properties
create mode 100644 auth-service/src/main/resources/application-kube.properties
create mode 100644 ca.crt
create mode 100644 config/alfresco-global.properties
create mode 100644 config/solrcore.properties
create mode 100644 dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
create mode 100644 dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
create mode 100644 docker-compose.yml
create mode 100644 eureka-server/src/main/resources/application-docker.properties
create mode 100644 k8s/minikube/bootstrap/postgres/configmap.yml
create mode 100644 k8s/minikube/bootstrap/postgres/service.yml
create mode 100644 k8s/minikube/bootstrap/postgres/statefulset.yml
create mode 100644 k8s/minikube/bootstrap/postgres/volume.yml
create mode 100644 k8s/minikube/services/auth-service/deployment.yml
create mode 100644 k8s/minikube/services/auth-service/service.yml
create mode 100644 k8s/minikube/services/dms-mediator/deployment.yml
create mode 100644 k8s/minikube/services/dms-mediator/service.yml
create mode 100644 k8s/minikube/services/lms-gateway/deployment.yml
create mode 100644 k8s/minikube/services/lms-gateway/service.yml
create mode 100644 k8s/minikube/services/payment-service/deployment.yml
create mode 100644 k8s/minikube/services/payment-service/service.yml
create mode 100644 k8s/minikube/services/resource-management/deployment.yml
create mode 100644 k8s/minikube/services/resource-management/service.yml
delete mode 100644 lib-security/pom.xml
delete mode 100644 lib-security/src/main/java/com/itgura/config/JwtAuthenticationFilter.java
delete mode 100644 lib-security/src/main/java/com/itgura/util/JwtService.java
delete mode 100644 lib-security/src/main/java/com/itgura/util/JwtServiceImpl.java
delete mode 100644 lib-security/src/main/resources/entity-field-validation.properties
delete mode 100644 lib-security/src/main/resources/static-field-validation.properties
delete mode 100644 lib-security/src/main/resources/swagger.properties
create mode 100644 lms-gateway/src/main/resources/application-docker.properties
create mode 100644 lms-gateway/src/main/resources/application-kube.properties
delete mode 100644 lms-gateway/src/main/resources/application.yml
create mode 100644 payment-service/src/main/resources/application-docker.properties
create mode 100644 payment-service/src/main/resources/application-kube.properties
create mode 100644 pom.xml
rename user-management/user-management-dao/src/main/resources/application-dev.properties => resource-management/resource-management-all/src/main/resources/application-docker.properties (51%)
create mode 100644 resource-management/resource-management-all/src/main/resources/application-kube.properties
delete mode 100644 user-management/.mvn/wrapper/maven-wrapper.properties
delete mode 100644 user-management/pom.xml
delete mode 100644 user-management/user-management-all/pom.xml
delete mode 100644 user-management/user-management-all/src/main/java/com/itgura/UserMain.java
delete mode 100644 user-management/user-management-all/src/main/java/com/itgura/config/SecurityConfiguration.java
delete mode 100644 user-management/user-management-all/src/main/java/com/itgura/controller/sampleController.java
delete mode 100644 user-management/user-management-all/src/main/resources/application.properties
delete mode 100644 user-management/user-management-dao/pom.xml
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/dto/request/AuthenticationRequest.java
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/dto/request/RegisterRequest.java
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/dto/response/AuthenticationResponse.java
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/entity/User.java
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/enums/Role.java
delete mode 100644 user-management/user-management-dao/src/main/java/com/itgura/repository/UserRepository.java
delete mode 100644 user-management/user-management-dao/src/main/resources/application-prod.properties
delete mode 100644 user-management/user-management-service/pom.xml
delete mode 100644 user-management/user-management-service/src/main/java/com/itgura/service/AuthenticationService.java
delete mode 100644 user-management/user-management-service/src/main/java/com/itgura/service/impl/AuthenticationServiceImpl.java
diff --git a/auth-service/pom.xml b/auth-service/pom.xml
index 2640a0d..a043a7a 100644
--- a/auth-service/pom.xml
+++ b/auth-service/pom.xml
@@ -3,12 +3,12 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.5
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura
+ jar
auth-service
0.0.1-SNAPSHOT
auth-service
@@ -40,11 +40,7 @@
postgresql
runtime
-
- org.projectlombok
- lombok
- true
-
+
org.springframework.boot
spring-boot-starter-test
@@ -93,6 +89,11 @@
org.projectlombok
lombok
+
+
+
+
+
@@ -106,19 +107,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
diff --git a/auth-service/src/main/java/com/itgura/authservice/AuthServiceApplication.java b/auth-service/src/main/java/com/itgura/authservice/AuthServiceApplication.java
index 310cda2..aac478d 100644
--- a/auth-service/src/main/java/com/itgura/authservice/AuthServiceApplication.java
+++ b/auth-service/src/main/java/com/itgura/authservice/AuthServiceApplication.java
@@ -13,3 +13,5 @@ public static void main(String[] args) {
}
}
+
+
diff --git a/auth-service/src/main/resources/application-docker.properties b/auth-service/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..fcfcb84
--- /dev/null
+++ b/auth-service/src/main/resources/application-docker.properties
@@ -0,0 +1,25 @@
+spring.application.name=auth-service
+server.port=8098
+
+#datasource configuration
+#spring.datasource.url=jdbc:postgresql://dpg-cp2qofi1hbls738314e0-a.oregon-postgres.render.com:5432/it_gura
+#spring.datasource.username= it_gura_user
+#spring.datasource.password= lsbflvJ0HfdVIgbHNbCEZnzV3o9SAErn
+#spring.datasource.hikari.schema=auth_service
+spring.datasource.url=jdbc:postgresql://postgres-main:5432/itgura
+spring.datasource.username=postgres
+spring.datasource.password=root
+spring.datasource.hikari.schema=auth_service
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.format_sql=true
+
+
+# eureka
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/auth-service/src/main/resources/application-kube.properties b/auth-service/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..a45455c
--- /dev/null
+++ b/auth-service/src/main/resources/application-kube.properties
@@ -0,0 +1,30 @@
+spring.application.name=auth-service
+server.port=8098
+
+#datasource configuration
+#spring.datasource.url=jdbc:postgresql://dpg-cp2qofi1hbls738314e0-a.oregon-postgres.render.com:5432/it_gura
+#spring.datasource.username= it_gura_user
+#spring.datasource.password= lsbflvJ0HfdVIgbHNbCEZnzV3o9SAErn
+#spring.datasource.hikari.schema=auth_service
+spring.datasource.url=jdbc:postgresql://postgres/itgura
+spring.datasource.username=postgres
+spring.datasource.password=root
+spring.datasource.hikari.schema=auth_service
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.format_sql=true
+
+#linkered
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+
+
+# eureka
+eureka.client.enabled=false
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/auth-service/src/main/resources/application.properties b/auth-service/src/main/resources/application.properties
index acea25a..f02958b 100644
--- a/auth-service/src/main/resources/application.properties
+++ b/auth-service/src/main/resources/application.properties
@@ -1,6 +1,12 @@
spring.application.name=auth-service
server.port=8098
+# eureka
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=localhost
+eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
+
#datasource configuration
#spring.datasource.url=jdbc:postgresql://dpg-cp2qofi1hbls738314e0-a.oregon-postgres.render.com:5432/it_gura
#spring.datasource.username= it_gura_user
@@ -8,7 +14,7 @@ server.port=8098
#spring.datasource.hikari.schema=auth_service
spring.datasource.url=jdbc:postgresql://localhost:5432/itgura
spring.datasource.username=postgres
-spring.datasource.password=1234
+spring.datasource.password=root
spring.datasource.hikari.schema=auth_service
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.show-sql=true
@@ -16,10 +22,6 @@ spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
-# eureka
-eureka.client.register-with-eureka=true
-eureka.client.fetch-registry=true
-eureka.instance.hostname=localhost
-eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
+
jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/ca.crt b/ca.crt
new file mode 100644
index 0000000000000000000000000000000000000000..6d5bec3b5031a443347633a3dfe0699ad73853b6
GIT binary patch
literal 2226
zcma*p%Tl6A5Cz~`6EW{Fd!s|NL1i%u1O&SUxrl%}@q(gw7nO&fnJ>$piH=@%5b#%J
zWu82FvZ{Xm`TI-y@3Wg4shRduC;gdf#{G0;w&z<*RpZA0o?lWSwb}PmJ?*Bs_3*ez
zTWRL`#=h%0`|&(7?y$_#O?pgMey`=J@GEA&UV4_L3agrq;r4ysWb35~+p%ZQv%&U|
zUeakArLs}M=&RN1bdrV{zYVRF#(aZ!5lTIsiR$F&ck{4sq(j;6fB3b3@@uD+EWi4_
z@s8S$#D6MOg)w9);2YlG(-f!M^qRT7Se>K=W_7%eerPk0`7K)}>6?gqtoLcL#IOUW
z2XEJ>mvxxYs*$>R{HbkEM2$7
5lIg24vOTkLQ)1st9{R>npro;9koA
zitmEGjqiF|W7$lDwBz|f(KXg7^?MX5;(7}22+s{2{-AZ6&l~T90cDmc-F
zl`gLN-r#w{W2w$f^AScbW_RlRD(Z>HhuS;PZbW}rnZhcGDq-FgF_5uB;})f2=aq~f
zjEC4Cq-}UBSWh%x&kSyHT#8%ZwV%0`#P6x3hsBn0#N0sL#$dsEMzI6gyEw1%o;;Oj
z%&Um=fJaM)a_;FSp9Qpr0U}^_6jKLb$WGk<}{b%UFM^W;^=!
zBukm@CD=s}OJf~cAd6XH%`Dw~g)5B(t8$#cO-e!v%Xoh<{8`&QFAdusR
z>SlXKJ*|8LMc(LNoVQpHzfVTLG6?3M4B`a$agJU_#9SvwlzWx+iYgdf0cR+=Toq3hneAwG#^A@%p`{N8o
zUEZ%WjdT9Qvm#ox)wSIM;K2XLevWpQ%2S1qMadJ9R(GU4T81p`88J
za@?Msu_kv3yL5#eV64(%owMA7&DpTefy2h
zL)8xCUO=coEMgZmKGNYsT!%g_Oj@uW#60T%3vRD6jdJyyeiyWxiY>s1H+P?Jyq9+P
zkIZhYo#Q{1@s*{>GSZcJSH@j<&aXv{HM?SHR>`+rylwB*G366CL)@(Ics|QEb|wcR
t25N1y#G7^Bs9Z||8zm7jd{R_P+Vmkl;
literal 0
HcmV?d00001
diff --git a/config/alfresco-global.properties b/config/alfresco-global.properties
new file mode 100644
index 0000000..e591102
--- /dev/null
+++ b/config/alfresco-global.properties
@@ -0,0 +1,10 @@
+dir.keystore=${dir.root}/keystore
+keystore.type=JCEKS
+ssl.keystore.location=${dir.keystore}/ssl.keystore
+ssl.keystore.type=JCEKS
+ssl.truststore.location=${dir.keystore}/ssl.truststore
+ssl.truststore.type=JCEKS
+
+
+
+
diff --git a/config/solrcore.properties b/config/solrcore.properties
new file mode 100644
index 0000000..1d3c741
--- /dev/null
+++ b/config/solrcore.properties
@@ -0,0 +1,6 @@
+dir.keystore=${dir.root}/keystore
+ssl.keystore.location=${dir.keystore}/ssl.repo.client.keystore
+ssl.keystore.type=JCEKS
+ssl.truststore.location=${dir.keystore}/ssl.repo.client.truststore
+ssl.truststore.type=JCEKS
+ssl.truststore.password=[your_truststore_password]
\ No newline at end of file
diff --git a/dms-mediator/dms-mediator-all/pom.xml b/dms-mediator/dms-mediator-all/pom.xml
index 07f72fc..a0cf251 100644
--- a/dms-mediator/dms-mediator-all/pom.xml
+++ b/dms-mediator/dms-mediator-all/pom.xml
@@ -6,8 +6,31 @@
com.itgura.lms
1.0.0
+ jar
dms-mediator-all
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
+
com.itgura.lms
@@ -21,6 +44,7 @@
17
17
+ UTF-8
diff --git a/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties b/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..69ad14d
--- /dev/null
+++ b/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
@@ -0,0 +1,35 @@
+server.port=8099
+spring.application.name=dms-mediator
+#logging.level.org.springframework.core.env=DEBUG
+
+
+spring.servlet.multipart.max-file-size=35MB
+spring.servlet.multipart.max-request-size=35MB
+# Alfresco
+alfresco.base.url=http://alfresco:8080/alfresco
+
+alfresco.username=admin
+alfresco.password=admin
+alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+alfresco.uploadRelativePath=/dms
+
+#alfresco.base.url=http://192.168.1.87:8080/alfresco
+
+#eureka
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.instance.prefer-ip-address=true
+
+#swagger
+#server.servlet.context-path=/
+#
+#openapi.service.title=Document Mediator
+#openapi.service.version=1.0
+#openapi.service.url=http://localhost:8081
+#springdoc.api-docs.path=dms-mediator/v3/api-docs
+#springdoc.swagger-ui.path=dms-mediator/swagger-ui.html
+
+
diff --git a/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties b/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..855bc27
--- /dev/null
+++ b/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
@@ -0,0 +1,40 @@
+server.port=8099
+spring.application.name=dms-mediator
+#logging.level.org.springframework.core.env=DEBUG
+
+
+spring.servlet.multipart.max-file-size=35MB
+spring.servlet.multipart.max-request-size=35MB
+# Alfresco
+alfresco.base.url=http://alfresco:8080/alfresco
+
+alfresco.username=admin
+alfresco.password=admin
+alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+alfresco.uploadRelativePath=/dms
+
+#alfresco.base.url=http://192.168.1.87:8080/alfresco
+
+#linkered
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+
+#eureka
+eureka.client.enabled=false
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.instance.prefer-ip-address=true
+
+#swagger
+#server.servlet.context-path=/
+#
+#openapi.service.title=Document Mediator
+#openapi.service.version=1.0
+#openapi.service.url=http://localhost:8081
+#springdoc.api-docs.path=dms-mediator/v3/api-docs
+#springdoc.swagger-ui.path=dms-mediator/swagger-ui.html
+
+
diff --git a/dms-mediator/dms-mediator-dao/pom.xml b/dms-mediator/dms-mediator-dao/pom.xml
index 2a66cd0..c97807b 100644
--- a/dms-mediator/dms-mediator-dao/pom.xml
+++ b/dms-mediator/dms-mediator-dao/pom.xml
@@ -6,10 +6,10 @@
dms-mediator
1.0.0
+ jar
dms-mediator-dao
- 17
- 17
+ UTF-8
@@ -27,16 +27,29 @@
org.projectlombok
lombok
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
- 2.0.0
-
-
- org.springframework.boot
- spring-boot-starter-validation
-
+
+
+
+
+
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ jib-execution
+
+ build
+
+ none
+
+
+
+
+
\ No newline at end of file
diff --git a/dms-mediator/dms-mediator-service/pom.xml b/dms-mediator/dms-mediator-service/pom.xml
index 6b0cb11..7544448 100644
--- a/dms-mediator/dms-mediator-service/pom.xml
+++ b/dms-mediator/dms-mediator-service/pom.xml
@@ -7,6 +7,7 @@
dms-mediator
1.0.0
+ jar
dms-mediator-service
@@ -28,7 +29,23 @@
- 17
- 17
+
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ jib-execution
+
+ build
+
+ none
+
+
+
+
+
\ No newline at end of file
diff --git a/dms-mediator/pom.xml b/dms-mediator/pom.xml
index 369570f..93c553e 100644
--- a/dms-mediator/pom.xml
+++ b/dms-mediator/pom.xml
@@ -4,29 +4,30 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.1.5
-
-
- com.itgura.lms
- dms-mediator
- pom
- 1.0.0
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
+ dms-mediator
+ pom
dms-mediator-all
dms-mediator-dao
dms-mediator-service
+ 1.0.0
+
+
+
+
+
- 17
- 17
- 2022.0.5
+ 17
+ 2023.0.1
@@ -34,7 +35,15 @@
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
-
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
@@ -48,4 +57,14 @@
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..a1ea3ae
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,182 @@
+services:
+ postgres-main:
+ container_name: postgres-main
+ image: postgres
+ ports:
+ - "5432:5432"
+ environment:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: root
+ POSTGRES_DB: itgura
+ PGDATA: /data/postgres
+ volumes:
+ - postgres:/data/postgres
+ networks:
+ - postgres-main
+ restart: unless-stopped
+
+ pgadmin:
+ container_name: pgadmin
+ image: dpage/pgadmin4
+ ports:
+ - "5050:80"
+ environment:
+ PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.com}
+ PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
+ PGADMIN_CONFIG_SERVER_MODE: 'False'
+ volumes:
+ - pgadmin:/var/lib/pgadmin
+ networks:
+ - postgres-main
+ restart: unless-stopped
+
+ eureka-server:
+ container_name: eureka-server
+ image: yesitha/eureka-server:latest
+ ports:
+ - "8761:8761"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ networks:
+ - spring
+
+ lms-gateway:
+ container_name: lms-gateway
+ image: yesitha/lms-gateway:latest
+ ports:
+ - "8081:8081"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
+ - EUREKA_INSTANCE_HOSTNAME=lms-gateway
+ depends_on:
+ - eureka-server
+ networks:
+ - spring
+
+ auth-service:
+ container_name: auth-service
+ image: yesitha/auth-service:latest
+ ports:
+ - "8098:8098"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
+ - EUREKA_INSTANCE_HOSTNAME=auth-service
+ depends_on:
+ - eureka-server
+ - postgres-main
+ networks:
+ - spring
+ - postgres-main
+
+ payment-service:
+ container_name: payment-service
+ image: yesitha/payment-service:latest
+ ports:
+ - "8199:8199"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
+ - EUREKA_INSTANCE_HOSTNAME=payment-service
+ depends_on:
+ - eureka-server
+ - postgres-main
+ networks:
+ - spring
+ - postgres-main
+
+ resource-management:
+ container_name: resource-management
+ image: yesitha/resource-management-all:latest
+ ports:
+ - "8092:8092"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
+ - EUREKA_INSTANCE_HOSTNAME=resource-management
+ depends_on:
+ - eureka-server
+ - postgres-main
+ networks:
+ - spring
+ - postgres-main
+
+ dms-mediator:
+ container_name: dms-mediator
+ image: yesitha/dms-mediator-all:latest
+ ports:
+ - "8099:8099"
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
+ - EUREKA_INSTANCE_HOSTNAME=dms-mediator
+ - ALFRESCO_BASE_URL=http://alfresco:8080
+ depends_on:
+ - eureka-server
+ - alfresco
+ networks:
+ - spring
+
+ alfresco:
+ container_name: alfresco
+ image: alfresco/alfresco-content-repository-community:latest
+ environment:
+ JAVA_OPTS: "
+ -Ddb.driver=org.postgresql.Driver
+ -Ddb.username=postgres
+ -Ddb.password=root
+ -Ddb.url=jdbc:postgresql://postgres-main/alfresco
+ -Dsolr.host=solr6
+ -Dsolr.port=8983
+ -Dsolr.secureComms=none
+ -Dsolr.base.url=/solr
+ -Dindex.subsystem.name=solr6
+ -Dalfresco.host=localhost
+ -Dalfresco.port=8080
+ -Dalfresco.context=alfresco
+ -Dalfresco.protocol=http"
+ ports:
+ - "8080:8080"
+ depends_on:
+ - postgres-main
+ - solr6
+ networks:
+ - spring
+ - postgres-main
+ volumes:
+ - ./keystore:/opt/alfresco-search-services/solrhome/alfresco/keystore
+ - ./config/alfresco-global.properties:/usr/local/tomcat/shared/classes/alfresco-global.properties
+ - ./config/solrcore.properties:/usr/local/tomcat/shared/classes/solrcore.properties
+ solr6:
+ container_name: solr6
+ image: alfresco/alfresco-search-services:2.0.11
+ environment:
+ SOLR_ALFRESCO_HOST: "alfresco"
+ SOLR_ALFRESCO_PORT: "8080"
+ SOLR_SOLR_HOST: "solr6"
+ SOLR_SOLR_PORT: "8983"
+ SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
+ ports:
+ - "8983:8983"
+ networks:
+ - spring
+ - postgres-main
+
+networks:
+ postgres-main:
+ driver: bridge
+ spring:
+ driver: bridge
+
+volumes:
+ postgres:
+ pgadmin:
+ alfresco-data:
+ driver: local
+ solr-data:
+ driver: local
+
+##commands
+# mvn clean package -P build-docker-image
+# docker-compose up -d
diff --git a/eureka-server/pom.xml b/eureka-server/pom.xml
index 9449eb2..585c3bd 100644
--- a/eureka-server/pom.xml
+++ b/eureka-server/pom.xml
@@ -3,19 +3,50 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.4
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
+
+
+
+
+
+
+
+ jar
com.itgura
eureka-server
0.0.1-SNAPSHOT
eureka-server
service discovery server for Itgura LMS
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
17
2023.0.1
+ 17
+ 17
@@ -47,6 +78,7 @@
org.springframework.boot
spring-boot-maven-plugin
+
diff --git a/eureka-server/src/main/resources/application-docker.properties b/eureka-server/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..cad25c9
--- /dev/null
+++ b/eureka-server/src/main/resources/application-docker.properties
@@ -0,0 +1,11 @@
+spring.application.name=eureka-server
+server.port=8761
+eureka.instance.prefer-ip-address=true
+eureka.client.register-with-eureka=false
+eureka.client.fetch-registry=false
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
+eureka.server.wait-time-in-ms-when-sync-empty=0
+
+
+#spring.cloud.config.import-check.enabled=false
+
diff --git a/k8s/minikube/bootstrap/postgres/configmap.yml b/k8s/minikube/bootstrap/postgres/configmap.yml
new file mode 100644
index 0000000..84822f4
--- /dev/null
+++ b/k8s/minikube/bootstrap/postgres/configmap.yml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-config
+data:
+ POSTGRES_DB: itgura
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: root
+
+
+
+
+
diff --git a/k8s/minikube/bootstrap/postgres/service.yml b/k8s/minikube/bootstrap/postgres/service.yml
new file mode 100644
index 0000000..9f4a135
--- /dev/null
+++ b/k8s/minikube/bootstrap/postgres/service.yml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: postgres
+ ports:
+ - port: 5432
+ targetPort: 5432
+ type: ClusterIP
+
\ No newline at end of file
diff --git a/k8s/minikube/bootstrap/postgres/statefulset.yml b/k8s/minikube/bootstrap/postgres/statefulset.yml
new file mode 100644
index 0000000..1326b86
--- /dev/null
+++ b/k8s/minikube/bootstrap/postgres/statefulset.yml
@@ -0,0 +1,45 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: postgres
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+ labels:
+ app: postgres
+spec:
+ serviceName: postgres
+ replicas: 1
+ template:
+ metadata:
+ name: postgres
+ labels:
+ app: postgres
+ spec:
+ volumes:
+ - name: postgres
+ persistentVolumeClaim:
+ claimName: postgres-pc-volume-claim
+ containers:
+ - name: postgres
+ image: postgres
+ imagePullPolicy: IfNotPresent
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgres
+ envFrom:
+ - configMapRef:
+ name: postgres-config
+ resources:
+ requests:
+ memory: "256Mi"
+ cpu: "100m"
+ limits:
+ memory: "512Mi"
+ cpu: "500m"
+ restartPolicy: Always
+ selector:
+ matchLabels:
+ app: postgres
+
+
diff --git a/k8s/minikube/bootstrap/postgres/volume.yml b/k8s/minikube/bootstrap/postgres/volume.yml
new file mode 100644
index 0000000..62bcfad
--- /dev/null
+++ b/k8s/minikube/bootstrap/postgres/volume.yml
@@ -0,0 +1,37 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: postgres-pc-volume
+ labels:
+ type: local
+ app : postgres
+
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 5Gi
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: /mnt/data
+
+---
+
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: postgres-pc-volume-claim
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany
+ resources:
+ requests:
+ storage: 5Gi
+
+
+
+
+
\ No newline at end of file
diff --git a/k8s/minikube/services/auth-service/deployment.yml b/k8s/minikube/services/auth-service/deployment.yml
new file mode 100644
index 0000000..ff9b6b9
--- /dev/null
+++ b/k8s/minikube/services/auth-service/deployment.yml
@@ -0,0 +1,33 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: auth-service
+ labels:
+ app: auth-service
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: auth-service
+ template:
+ metadata:
+ name: auth-service
+ labels:
+ app: auth-service
+ spec:
+ containers:
+ - name: auth-service
+ image: yesitha/auth-service:latest
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 8098
+ protocol: TCP
+ env:
+ - name: SPRING_PROFILES_ACTIVE
+ value: kube
+
+ restartPolicy: Always
+
\ No newline at end of file
diff --git a/k8s/minikube/services/auth-service/service.yml b/k8s/minikube/services/auth-service/service.yml
new file mode 100644
index 0000000..b7a47d7
--- /dev/null
+++ b/k8s/minikube/services/auth-service/service.yml
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: auth-service
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: auth-service
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8098
+ type: ClusterIP
+
\ No newline at end of file
diff --git a/k8s/minikube/services/dms-mediator/deployment.yml b/k8s/minikube/services/dms-mediator/deployment.yml
new file mode 100644
index 0000000..c32735e
--- /dev/null
+++ b/k8s/minikube/services/dms-mediator/deployment.yml
@@ -0,0 +1,33 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: dms-mediator
+ labels:
+ app: dms-mediator
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: dms-mediator
+ template:
+ metadata:
+ name: dms-mediator
+ labels:
+ app: dms-mediator
+ spec:
+ containers:
+ - name: dms-mediator
+ image: yesitha/dms-mediator-all:latest
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 8099
+ protocol: TCP
+ env:
+ - name: SPRING_PROFILES_ACTIVE
+ value: kube
+
+ restartPolicy: Always
+
\ No newline at end of file
diff --git a/k8s/minikube/services/dms-mediator/service.yml b/k8s/minikube/services/dms-mediator/service.yml
new file mode 100644
index 0000000..246881e
--- /dev/null
+++ b/k8s/minikube/services/dms-mediator/service.yml
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: dms-mediator
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: dms-mediator
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8099
+ type: ClusterIP
+
\ No newline at end of file
diff --git a/k8s/minikube/services/lms-gateway/deployment.yml b/k8s/minikube/services/lms-gateway/deployment.yml
new file mode 100644
index 0000000..da4bf6f
--- /dev/null
+++ b/k8s/minikube/services/lms-gateway/deployment.yml
@@ -0,0 +1,31 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: lms-gateway
+ labels:
+ app: lms-gateway
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: lms-gateway
+ template:
+ metadata:
+ name: lms-gateway
+ labels:
+ app: lms-gateway
+ spec:
+ containers:
+ - name: lms-gateway
+ image: yesitha/lms-gateway:latest
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 8081
+ protocol: TCP
+ env:
+ - name: SPRING_PROFILES_ACTIVE
+ value: kube
+ restartPolicy: Always
diff --git a/k8s/minikube/services/lms-gateway/service.yml b/k8s/minikube/services/lms-gateway/service.yml
new file mode 100644
index 0000000..fd52e4b
--- /dev/null
+++ b/k8s/minikube/services/lms-gateway/service.yml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: lms-gateway
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: lms-gateway
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8081
+ type: LoadBalancer
diff --git a/k8s/minikube/services/payment-service/deployment.yml b/k8s/minikube/services/payment-service/deployment.yml
new file mode 100644
index 0000000..9f9402f
--- /dev/null
+++ b/k8s/minikube/services/payment-service/deployment.yml
@@ -0,0 +1,31 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: payment-service
+ labels:
+ app: payment-service
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: payment-service
+ template:
+ metadata:
+ name: payment-service
+ labels:
+ app: payment-service
+ spec:
+ containers:
+ - name: payment-service
+ image: yesitha/payment-service:latest
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 8199
+ protocol: TCP
+ env:
+ - name: SPRING_PROFILES_ACTIVE
+ value: kube
+ restartPolicy: Always
diff --git a/k8s/minikube/services/payment-service/service.yml b/k8s/minikube/services/payment-service/service.yml
new file mode 100644
index 0000000..d99e55a
--- /dev/null
+++ b/k8s/minikube/services/payment-service/service.yml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: payment-service
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: payment-service
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8199
+ type: ClusterIP
diff --git a/k8s/minikube/services/resource-management/deployment.yml b/k8s/minikube/services/resource-management/deployment.yml
new file mode 100644
index 0000000..218282c
--- /dev/null
+++ b/k8s/minikube/services/resource-management/deployment.yml
@@ -0,0 +1,31 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: resource-management
+ labels:
+ app: resource-management
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: resource-management
+ template:
+ metadata:
+ name: resource-management
+ labels:
+ app: resource-management
+ spec:
+ containers:
+ - name: resource-management
+ image: yesitha/resource-management-all:latest
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 8092
+ protocol: TCP
+ env:
+ - name: SPRING_PROFILES_ACTIVE
+ value: kube
+ restartPolicy: Always
diff --git a/k8s/minikube/services/resource-management/service.yml b/k8s/minikube/services/resource-management/service.yml
new file mode 100644
index 0000000..09d84db
--- /dev/null
+++ b/k8s/minikube/services/resource-management/service.yml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: resource-management
+ namespace: itgura
+ annotations:
+ linkerd.io/inject: enabled
+spec:
+ selector:
+ app: resource-management
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 8092
+ type: ClusterIP
diff --git a/lib-common/pom.xml b/lib-common/pom.xml
index b4c7269..e1c9468 100644
--- a/lib-common/pom.xml
+++ b/lib-common/pom.xml
@@ -5,19 +5,20 @@
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.1.5
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura.lms
+
+
lib-common
+ jar
0.0.1
- 17
- 17
+
UTF-8
@@ -25,8 +26,7 @@
org.springframework.boot
spring-boot-devtools
- runtime
- true
+ 3.3.1
io.swagger.core.v3
diff --git a/lib-global/pom.xml b/lib-global/pom.xml
index 3505d56..45d0670 100644
--- a/lib-global/pom.xml
+++ b/lib-global/pom.xml
@@ -3,33 +3,15 @@
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">
4.0.0
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 16
- 16
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 16
- 16
-
-
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 3.1.5
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura.lms
+ jar
+
+
lib-global
0.0.1
@@ -40,8 +22,7 @@
- 17
- 17
+
UTF-8
diff --git a/lib-security/pom.xml b/lib-security/pom.xml
deleted file mode 100644
index ae5a816..0000000
--- a/lib-security/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
- 4.0.0
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 3.1.5
-
-
-
- com.itgura.lms
- lib-security
- 0.0.1
-
-
- 17
- 17
- UTF-8
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-test
- test
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-security
-
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- io.jsonwebtoken
- jjwt-api
- 0.12.5
-
-
- io.jsonwebtoken
- jjwt-impl
- 0.12.5
-
-
- io.jsonwebtoken
- jjwt-jackson
- 0.12.5
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.springframework.security
- spring-security-test
- test
-
-
- org.apache.commons
- commons-lang3
-
-
- org.projectlombok
- lombok
- provided
-
-
-
-
-
\ No newline at end of file
diff --git a/lib-security/src/main/java/com/itgura/config/JwtAuthenticationFilter.java b/lib-security/src/main/java/com/itgura/config/JwtAuthenticationFilter.java
deleted file mode 100644
index 7c17bd7..0000000
--- a/lib-security/src/main/java/com/itgura/config/JwtAuthenticationFilter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.itgura.config;
-
-
-import com.itgura.util.JwtService;
-import com.itgura.util.JwtServiceImpl;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.lang.NonNull;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import java.io.IOException;
-
-@Component
-
-public class JwtAuthenticationFilter extends OncePerRequestFilter {
- private JwtService jwtService;
- private UserDetailsService userDetailsService;
-
- @Autowired
- public void setJwtService(JwtService jwtService) {
- this.jwtService = jwtService;
- }
-
- @Autowired
- public void setUserDetailsService(UserDetailsService userDetailsService) {
- this.userDetailsService = userDetailsService;
- }
-
-
- @Override
- protected void doFilterInternal(@NonNull HttpServletRequest request,
- @NonNull HttpServletResponse response,
- @NonNull FilterChain filterChain
- ) throws ServletException, IOException {
-
- final String authHeader = request.getHeader("Authorization");
- final String jwt;
- final String userEmail;
- if(StringUtils.isEmpty(authHeader) || StringUtils.startsWith(authHeader,"Bearer ")){
- filterChain.doFilter(request, response);
- return;
- }
- jwt = authHeader.substring(7);//Bearer length is 7
- userEmail = jwtService.extractUserName(jwt);//todo extract userEmail from jwt Token
-if(StringUtils.isNotEmpty(userEmail) && SecurityContextHolder.getContext().getAuthentication() == null){
- UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
- if(jwtService.isTokenValid(jwt, userDetails)){
- UsernamePasswordAuthenticationToken authToken =new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
- authToken.setDetails(
- new WebAuthenticationDetailsSource().buildDetails(request)
- );
- SecurityContextHolder.getContext().setAuthentication(authToken);
- }
- }
- filterChain.doFilter(request,response);
-
- }
-}
diff --git a/lib-security/src/main/java/com/itgura/util/JwtService.java b/lib-security/src/main/java/com/itgura/util/JwtService.java
deleted file mode 100644
index 22a1b97..0000000
--- a/lib-security/src/main/java/com/itgura/util/JwtService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.itgura.util;
-
-import io.jsonwebtoken.Claims;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Function;
-
-public interface JwtService {
- public String extractUserName(String token);
- public T extractClaim(String token, Function claimsResolver);
- public String generateToken(UserDetails userDetails);
- public String generateToken(
- Map extraClaims,
- UserDetails userDetails);
- public Boolean isTokenValid(String token, UserDetails userDetails);
- public String generateRefresh(Map extraClaims, UserDetails userDetails);
-
-}
diff --git a/lib-security/src/main/java/com/itgura/util/JwtServiceImpl.java b/lib-security/src/main/java/com/itgura/util/JwtServiceImpl.java
deleted file mode 100644
index 1eb04fd..0000000
--- a/lib-security/src/main/java/com/itgura/util/JwtServiceImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.itgura.util;
-
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-import io.jsonwebtoken.io.Decoders;
-import io.jsonwebtoken.security.Keys;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Service;
-
-import java.security.Key;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Function;
-
-@Service
-@Lazy
-public class JwtServiceImpl implements JwtService{
-
- private static final String SECRET_KEY ="f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635";
- public String extractUserName(String token) {
- return extractClaim(token,Claims::getSubject);
- }
-
- public T extractClaim(String token, Function claimsResolver) {
- final Claims claims = extractAllClaims(token);
- return claimsResolver.apply(claims);
- }
-
- public String generateToken(UserDetails userDetails) {
- return generateToken(new HashMap<>(), userDetails);
- }
- public String generateToken(
- Map extraClaims,
- UserDetails userDetails) {
- return Jwts.builder()
- .setSubject(userDetails.getUsername())
- .setIssuedAt(new Date(System.currentTimeMillis()))
- .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 24))
- .signWith(getSignInKey(), SignatureAlgorithm.HS256)
- .compact();
- }
-
- public Boolean isTokenValid(String token, UserDetails userDetails) {
- final String username = extractUserName(token);
- return (username.equals(userDetails.getUsername())&& !isTokenExpired(token));
- }
-
- private Boolean isTokenExpired(String token) {
- return extractExpiration(token).before(new Date());
- }
-
- private Date extractExpiration(String token) {
-
- return extractClaim(token, Claims::getExpiration);
- }
-
-
- private Claims extractAllClaims(String token) {
- return Jwts.parser().setSigningKey(getSignInKey()).build().parseClaimsJws(token).getBody();
- }
-
- private Key getSignInKey() {
- byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
- return Keys.hmacShaKeyFor(keyBytes);
- }
-
- public String generateRefresh(Map extraClaims, UserDetails userDetails) {
- return Jwts.builder()
- .setClaims(extraClaims)
- .setSubject(userDetails.getUsername())
- .setIssuedAt(new Date(System.currentTimeMillis()))
- .setExpiration(new Date(System.currentTimeMillis() + 604800000))
- .signWith(getSignInKey(), SignatureAlgorithm.HS256)
- .compact();
-
- }
-}
diff --git a/lib-security/src/main/resources/entity-field-validation.properties b/lib-security/src/main/resources/entity-field-validation.properties
deleted file mode 100644
index 43d769a..0000000
--- a/lib-security/src/main/resources/entity-field-validation.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-error.not_exist=The entity does not exist.
-error.create_fail=Failed to create the entity.
-error.update_fail=Failed to update the entity.
-error.cannot_be_null=Field cannot be null.
diff --git a/lib-security/src/main/resources/static-field-validation.properties b/lib-security/src/main/resources/static-field-validation.properties
deleted file mode 100644
index 2cf0d6a..0000000
--- a/lib-security/src/main/resources/static-field-validation.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-regex.patten.nic=your_nic_pattern_here
-regex.patten.email=your_email_pattern_here
-regex.patten.mobile.number=your_mobile_number_pattern_here
diff --git a/lib-security/src/main/resources/swagger.properties b/lib-security/src/main/resources/swagger.properties
deleted file mode 100644
index aa92dba..0000000
--- a/lib-security/src/main/resources/swagger.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-api.version=1.0
-swagger.enabled=false
-swagger.title=Your API Title
-swagger.description=Your API Description
-swagger.useDefaultResponseMessages=false
-swagger.enableUrlTemplating=true
-swagger.deepLinking=false
-swagger.defaultModelsExpandDepth=1
-swagger.defaultModelExpandDepth=1
-swagger.displayOperationId=false
-swagger.displayRequestDuration=false
-swagger.filter=false
-swagger.maxDisplayedTags=10
-swagger.showExtensions=false
-swagger.authheader.default=YourDefaultAuthorizationHeader
diff --git a/lms-gateway/pom.xml b/lms-gateway/pom.xml
index 4fb4f08..cfcf514 100644
--- a/lms-gateway/pom.xml
+++ b/lms-gateway/pom.xml
@@ -3,12 +3,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.4
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura
+ jar
+
lms-gateway
0.0.1-SNAPSHOT
lms-gateway
@@ -17,6 +18,28 @@
17
2023.0.1
+
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
org.springframework.cloud
@@ -60,6 +83,11 @@
jjwt-jackson
0.12.5
+
+
+
+
+
diff --git a/lms-gateway/src/main/resources/application-docker.properties b/lms-gateway/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..c08d3d5
--- /dev/null
+++ b/lms-gateway/src/main/resources/application-docker.properties
@@ -0,0 +1,88 @@
+spring.application.name=lms-gateway
+server.port=8081
+server.servlet.context-path=/
+
+#swagger
+#springdoc.enable-native-support=true
+#springdoc.api-docs.enabled=true
+#springdoc.api-docs.path=/swagger-ui.html
+#springdoc.swagger-ui.enabled=true
+#springdoc.swagger-ui.path=/swagger-ui.html
+#springdoc.swagger-ui.config-url=/v3/api-docs/swagger-config
+#
+#springdoc.swagger-ui.urls[0].name=lms-gateway
+#springdoc.swagger-ui.urls[0].url=/v3/api-docs
+#springdoc.swagger-ui.urls[0].display-name=lms-gateway
+#
+#springdoc.swagger-ui.urls[1].name=dms-mediator
+#springdoc.swagger-ui.urls[1].url=/dms-mediator/v3/api-docs
+#springdoc.swagger-ui.urls[1].display-name=dms-mediator
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+
+# eureka
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+# gateway
+
+#resource-management--not setup yet
+spring.cloud.gateway.routes[0].id:resource-management
+spring.cloud.gateway.routes[0].uri:lb://resource-management
+spring.cloud.gateway.routes[0].predicates[0].name=Path
+spring.cloud.gateway.routes[0].predicates[0].args.pattern=/resource-management/**
+
+
+spring.cloud.gateway.routes[0].filters[1].name=RewritePath
+spring.cloud.gateway.routes[0].filters[1].args.regexp=/resource-management/(?.*)
+spring.cloud.gateway.routes[0].filters[1].args.replacement=/api/v1/resource-management/${remaining}
+
+spring.cloud.gateway.routes[0].filters[0].name=AuthenticationFilter
+
+#dms-mediator
+spring.cloud.gateway.routes[1].id=dms-mediator
+spring.cloud.gateway.routes[1].uri=lb://dms-mediator
+spring.cloud.gateway.routes[1].predicates[0].name=Path
+spring.cloud.gateway.routes[1].predicates[0].args.pattern=/dms-mediator/**
+
+spring.cloud.gateway.routes[1].filters[1].name=RewritePath
+spring.cloud.gateway.routes[1].filters[1].args.regexp=/dms-mediator/(?.*)
+spring.cloud.gateway.routes[1].filters[1].args.replacement=/api/v1/dms-mediator/${remaining}
+
+spring.cloud.gateway.routes[1].filters[0].name=AuthenticationFilter
+
+#auth-service
+spring.cloud.gateway.routes[2].id=auth-service
+spring.cloud.gateway.routes[2].uri=lb://auth-service
+spring.cloud.gateway.routes[2].predicates[0].name=Path
+spring.cloud.gateway.routes[2].predicates[0].args.pattern=/auth-service/**
+
+
+spring.cloud.gateway.routes[2].filters[0].name=RewritePath
+spring.cloud.gateway.routes[2].filters[0].args.regexp=/auth-service/(?.*)
+spring.cloud.gateway.routes[2].filters[0].args.replacement=/api/v1/auth-service/${remaining}
+
+#payment-service
+spring.cloud.gateway.routes[3].id=payment-service
+spring.cloud.gateway.routes[3].uri=lb://payment-service
+spring.cloud.gateway.routes[3].predicates[0].name=Path
+spring.cloud.gateway.routes[3].predicates[0].args.pattern=/payment-service/**
+
+
+spring.cloud.gateway.routes[3].filters[1].name=RewritePath
+spring.cloud.gateway.routes[3].filters[1].args.regexp=/payment-service/(?.*)
+spring.cloud.gateway.routes[3].filters[1].args.replacement=/api/v1/payment-service/${remaining}
+
+spring.cloud.gateway.routes[3].filters[0].name=AuthenticationFilter
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lms-gateway/src/main/resources/application-kube.properties b/lms-gateway/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..e59386a
--- /dev/null
+++ b/lms-gateway/src/main/resources/application-kube.properties
@@ -0,0 +1,93 @@
+spring.application.name=lms-gateway
+server.port=8081
+server.servlet.context-path=/
+
+#swagger
+#springdoc.enable-native-support=true
+#springdoc.api-docs.enabled=true
+#springdoc.api-docs.path=/swagger-ui.html
+#springdoc.swagger-ui.enabled=true
+#springdoc.swagger-ui.path=/swagger-ui.html
+#springdoc.swagger-ui.config-url=/v3/api-docs/swagger-config
+#
+#springdoc.swagger-ui.urls[0].name=lms-gateway
+#springdoc.swagger-ui.urls[0].url=/v3/api-docs
+#springdoc.swagger-ui.urls[0].display-name=lms-gateway
+#
+#springdoc.swagger-ui.urls[1].name=dms-mediator
+#springdoc.swagger-ui.urls[1].url=/dms-mediator/v3/api-docs
+#springdoc.swagger-ui.urls[1].display-name=dms-mediator
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+
+#linkered
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+
+# eureka
+eureka.client.enabled=false
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+# gateway
+
+#resource-management--not setup yet
+spring.cloud.gateway.routes[0].id:resource-management
+spring.cloud.gateway.routes[0].uri:lb://resource-management
+spring.cloud.gateway.routes[0].predicates[0].name=Path
+spring.cloud.gateway.routes[0].predicates[0].args.pattern=/resource-management/**
+
+
+spring.cloud.gateway.routes[0].filters[1].name=RewritePath
+spring.cloud.gateway.routes[0].filters[1].args.regexp=/resource-management/(?.*)
+spring.cloud.gateway.routes[0].filters[1].args.replacement=/api/v1/resource-management/${remaining}
+
+spring.cloud.gateway.routes[0].filters[0].name=AuthenticationFilter
+
+#dms-mediator
+spring.cloud.gateway.routes[1].id=dms-mediator
+spring.cloud.gateway.routes[1].uri=lb://dms-mediator
+spring.cloud.gateway.routes[1].predicates[0].name=Path
+spring.cloud.gateway.routes[1].predicates[0].args.pattern=/dms-mediator/**
+
+spring.cloud.gateway.routes[1].filters[1].name=RewritePath
+spring.cloud.gateway.routes[1].filters[1].args.regexp=/dms-mediator/(?.*)
+spring.cloud.gateway.routes[1].filters[1].args.replacement=/api/v1/dms-mediator/${remaining}
+
+spring.cloud.gateway.routes[1].filters[0].name=AuthenticationFilter
+
+#auth-service
+spring.cloud.gateway.routes[2].id=auth-service
+spring.cloud.gateway.routes[2].uri=lb://auth-service
+spring.cloud.gateway.routes[2].predicates[0].name=Path
+spring.cloud.gateway.routes[2].predicates[0].args.pattern=/auth-service/**
+
+
+spring.cloud.gateway.routes[2].filters[0].name=RewritePath
+spring.cloud.gateway.routes[2].filters[0].args.regexp=/auth-service/(?.*)
+spring.cloud.gateway.routes[2].filters[0].args.replacement=/api/v1/auth-service/${remaining}
+
+#payment-service
+spring.cloud.gateway.routes[3].id=payment-service
+spring.cloud.gateway.routes[3].uri=lb://payment-service
+spring.cloud.gateway.routes[3].predicates[0].name=Path
+spring.cloud.gateway.routes[3].predicates[0].args.pattern=/payment-service/**
+
+
+spring.cloud.gateway.routes[3].filters[1].name=RewritePath
+spring.cloud.gateway.routes[3].filters[1].args.regexp=/payment-service/(?.*)
+spring.cloud.gateway.routes[3].filters[1].args.replacement=/api/v1/payment-service/${remaining}
+
+spring.cloud.gateway.routes[3].filters[0].name=AuthenticationFilter
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lms-gateway/src/main/resources/application.yml b/lms-gateway/src/main/resources/application.yml
deleted file mode 100644
index 02a2f21..0000000
--- a/lms-gateway/src/main/resources/application.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-#springdoc:
-# enable-native-support: true
-# api-docs:
-# groups:
-# enabled: true
-# enabled: true
-# group-configs:
-# - group: dms-mediator
-# paths-to-match:
-# - /dms-mediator/**
-# display-name: dms-mediator
-# - group: resource-management
-# paths-to-match:
-# - /resource-management/**
-# display-name: resource-management
-# swagger-ui:
-# config-url: /v1/api-docs/swagger-config
-# url: /v1/api-docs
-# urls:
-# - url: /dms-mediator/v1/api-docs
-# name: dms-mediator
-# - url: /resource-management/v1/api-docs
-# name: resource-management
\ No newline at end of file
diff --git a/payment-service/pom.xml b/payment-service/pom.xml
index 340db80..b96415c 100644
--- a/payment-service/pom.xml
+++ b/payment-service/pom.xml
@@ -3,16 +3,38 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.5
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura
+ jar
+
payment-service
0.0.1-SNAPSHOT
payment-service
Payment Service for LMS
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
17
2023.0.1
@@ -84,6 +106,11 @@
org.glassfish.jaxb
jaxb-runtime
+
+
+
+
+
@@ -97,19 +124,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
index f218e5e..f938866 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
@@ -150,6 +150,8 @@ private double getMonthlyPayment(UUID classId) throws ApplicationException {
ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, AppResponse.class);
AppResponse response = responseEntity.getBody();
+ System.out.println("Monthly Payment Received : "+response);
+
if (response == null || response.getData() == null) {
throw new ApplicationException("Error while getting monthly payment: response or data is null");
}
diff --git a/payment-service/src/main/resources/application-docker.properties b/payment-service/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..3d3908e
--- /dev/null
+++ b/payment-service/src/main/resources/application-docker.properties
@@ -0,0 +1,30 @@
+spring.application.name=payment-service
+server.port=8199
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
+
+
+#datasource configuration
+spring.datasource.url=jdbc:postgresql://postgres-main:5432/itgura
+spring.datasource.username=postgres
+spring.datasource.password=root
+spring.datasource.hikari.schema=payment_service
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.format_sql=true
+
+
+# eureka
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+
+# payhere
+payhere.merchentSecretCode=YOUR_MERCHANT_SECRET_KEY
+payhere.merchentID=YOUR_MERCHANT_ID
+#
+## api gateway
+#apiGateway.url=http://localhost:8081
\ No newline at end of file
diff --git a/payment-service/src/main/resources/application-kube.properties b/payment-service/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..827f97e
--- /dev/null
+++ b/payment-service/src/main/resources/application-kube.properties
@@ -0,0 +1,34 @@
+spring.application.name=payment-service
+server.port=8199
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
+
+
+#datasource configuration
+spring.datasource.url=jdbc:postgresql://postgres/itgura
+spring.datasource.username=postgres
+spring.datasource.password=root
+spring.datasource.hikari.schema=payment_service
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.format_sql=true
+
+#linkered
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+
+# eureka
+eureka.client.enabled=false
+eureka.client.register-with-eureka=true
+eureka.client.fetch-registry=true
+eureka.instance.hostname=eureka-server
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+
+# payhere
+payhere.merchentSecretCode=YOUR_MERCHANT_SECRET_KEY
+payhere.merchentID=YOUR_MERCHANT_ID
+#
+## api gateway
+#apiGateway.url=http://localhost:8081
\ No newline at end of file
diff --git a/payment-service/src/main/resources/application.properties b/payment-service/src/main/resources/application.properties
index c9d38a1..93810f7 100644
--- a/payment-service/src/main/resources/application.properties
+++ b/payment-service/src/main/resources/application.properties
@@ -6,7 +6,7 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.ser
#datasource configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/itgura
spring.datasource.username=postgres
-spring.datasource.password=1234
+spring.datasource.password=root
spring.datasource.hikari.schema=payment_service
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.show-sql=true
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..03c05c6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,116 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.4
+
+
+ com.itgura.lms
+ lms
+ pom
+ 1.0.0
+
+
+ lib-common
+ lib-global
+ eureka-server
+ lms-gateway
+ resource-management
+ auth-service
+ dms-mediator
+ payment-service
+
+
+
+
+ lms
+ Learning Management System
+
+
+
+ 17
+ 17
+ 17
+ 3.2.4
+ 3.2.4
+ 3.2.4
+ yesitha/${project.artifactId}:${project.version}
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring.boot.dependencies.version}
+ import
+ pom
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 17
+ 17
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.maven.plugin.version}
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+ 3.4.3
+
+
+ eclipse-temurin:17
+
+
+ amd64
+ linux
+
+
+
+ arm64
+ linux
+
+
+
+
+
+
+
+ latest
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resource-management/pom.xml b/resource-management/pom.xml
index bffad5b..29712d7 100644
--- a/resource-management/pom.xml
+++ b/resource-management/pom.xml
@@ -3,14 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.4
-
+ com.itgura.lms
+ lms
+ 1.0.0
+
- com.itgura.lms
- resource-management
pom
+ resource-management
+
resource-management-all
resource-management-dao
@@ -20,16 +20,25 @@
17
- 17
- 17
2023.0.1
+
+
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
@@ -44,6 +53,16 @@
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/resource-management/resource-management-all/pom.xml b/resource-management/resource-management-all/pom.xml
index 2baf9fe..00368cf 100644
--- a/resource-management/resource-management-all/pom.xml
+++ b/resource-management/resource-management-all/pom.xml
@@ -9,8 +9,29 @@
1.0.0
- com.itgura.lms
+ jar
resource-management-all
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
com.itgura.lms
@@ -28,6 +49,7 @@
17
UTF-8
+
@@ -37,4 +59,5 @@
+
\ No newline at end of file
diff --git a/user-management/user-management-dao/src/main/resources/application-dev.properties b/resource-management/resource-management-all/src/main/resources/application-docker.properties
similarity index 51%
rename from user-management/user-management-dao/src/main/resources/application-dev.properties
rename to resource-management/resource-management-all/src/main/resources/application-docker.properties
index 17218b1..fef4fb5 100644
--- a/user-management/user-management-dao/src/main/resources/application-dev.properties
+++ b/resource-management/resource-management-all/src/main/resources/application-docker.properties
@@ -1,8 +1,15 @@
+server.port=8092
+spring.application.name=resource-management
+logging.level.org.springframework.core.env=DEBUG
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
+logging.level.org.springframework.security=DEBUG
-spring.datasource.url=jdbc:postgresql://localhost:5432/itgura
+
+
+spring.datasource.url=jdbc:postgresql://postgres-main:5432/itgura
spring.datasource.username=postgres
-spring.datasource.password=1234
-spring.datasource.hikari.schema=user_management
+spring.datasource.password=root
+spring.datasource.hikari.schema=resource_management
spring.datasource.driver-class-name=org.postgresql.Driver
# Hibernate/JPA properties
@@ -17,8 +24,7 @@ spring.jpa.properties.hibernate.schema_update.unique_constraint_strategy=RECREAT
#spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
-spring.security.user.name=user
-spring.security.user.password=user
+
spring.datasource.hikari.maximum-pool-size=10000
spring.datasource.hikari.minimum-idle= 10
@@ -26,6 +32,9 @@ spring.datasource.hikari.idle-timeout= 120000
spring.datasource.hikari.connectionTimeout= 5000
#eureka
-eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
eureka.client.registerWithEureka=true
-eureka.client.fetchRegistry=true
\ No newline at end of file
+eureka.client.fetchRegistry=true
+eureka.instance.hostname=eureka-server
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/resource-management/resource-management-all/src/main/resources/application-kube.properties b/resource-management/resource-management-all/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..c4efa01
--- /dev/null
+++ b/resource-management/resource-management-all/src/main/resources/application-kube.properties
@@ -0,0 +1,45 @@
+server.port=8092
+spring.application.name=resource-management
+logging.level.org.springframework.core.env=DEBUG
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
+logging.level.org.springframework.security=DEBUG
+
+
+
+spring.datasource.url=jdbc:postgresql://postgres/itgura
+spring.datasource.username=postgres
+spring.datasource.password=root
+spring.datasource.hikari.schema=resource_management
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+# Hibernate/JPA properties
+spring.jpa.show-sql=true
+
+
+spring.jpa.hibernate.ddl-auto = update
+spring.sql.init.mode=always
+spring.jpa.generate-ddl=true
+spring.jpa.open-in-view=false
+spring.jpa.properties.hibernate.schema_update.unique_constraint_strategy=RECREATE_QUIETLY
+#spring.jpa.hibernate.ddl-auto=create
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+
+
+
+spring.datasource.hikari.maximum-pool-size=10000
+spring.datasource.hikari.minimum-idle= 10
+spring.datasource.hikari.idle-timeout= 120000
+spring.datasource.hikari.connectionTimeout= 5000
+
+#linkered
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+
+#eureka
+eureka.client.enabled=false
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.instance.hostname=eureka-server
+
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/resource-management/resource-management-dao/pom.xml b/resource-management/resource-management-dao/pom.xml
index 1ca89ab..3f064ad 100644
--- a/resource-management/resource-management-dao/pom.xml
+++ b/resource-management/resource-management-dao/pom.xml
@@ -9,12 +9,11 @@
1.0.0
- com.itgura.lms
+ jar
resource-management-dao
- 17
- 17
+
UTF-8
diff --git a/resource-management/resource-management-dao/src/main/resources/application-dev.properties b/resource-management/resource-management-dao/src/main/resources/application-dev.properties
index 15c30d7..1b0b737 100644
--- a/resource-management/resource-management-dao/src/main/resources/application-dev.properties
+++ b/resource-management/resource-management-dao/src/main/resources/application-dev.properties
@@ -2,7 +2,7 @@
spring.datasource.url=jdbc:postgresql://localhost:5432/itgura
spring.datasource.username=postgres
-spring.datasource.password=1234
+spring.datasource.password=root
spring.datasource.hikari.schema=resource_management
spring.datasource.driver-class-name=org.postgresql.Driver
diff --git a/resource-management/resource-management-service/pom.xml b/resource-management/resource-management-service/pom.xml
index c356154..baf1330 100644
--- a/resource-management/resource-management-service/pom.xml
+++ b/resource-management/resource-management-service/pom.xml
@@ -8,8 +8,8 @@
resource-management
1.0.0
+ jar
- com.itgura.lms
resource-management-service
@@ -21,8 +21,7 @@
- 17
- 17
+
UTF-8
diff --git a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/ClassServiceImpl.java b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/ClassServiceImpl.java
index b64a4b2..5a8b215 100644
--- a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/ClassServiceImpl.java
+++ b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/ClassServiceImpl.java
@@ -3,7 +3,6 @@
import com.itgura.dto.AppRequest;
import com.itgura.dto.AppResponse;
import com.itgura.entity.AClass;
-import com.itgura.entity.Fees;
import com.itgura.exception.ApplicationException;
import com.itgura.exception.ValueNotExistException;
import com.itgura.repository.ClassRepository;
diff --git a/user-management/.mvn/wrapper/maven-wrapper.properties b/user-management/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index 5f0536e..0000000
--- a/user-management/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
-wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
diff --git a/user-management/pom.xml b/user-management/pom.xml
deleted file mode 100644
index a77bed2..0000000
--- a/user-management/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 3.2.4
-
-
- com.itgura.lms
- user-management
- pom
-
- user-management-all
- user-management-dao
- user-management-service
-
- 1.0.0
-
-
- 17
- 17
- 17
- 2023.0.1
-
-
-
-
- org.springframework.cloud
- spring-cloud-starter-netflix-eureka-client
-
-
-
-
-
-
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud.version}
- pom
- import
-
-
-
-
-
-
diff --git a/user-management/user-management-all/pom.xml b/user-management/user-management-all/pom.xml
deleted file mode 100644
index eb0128f..0000000
--- a/user-management/user-management-all/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
- 4.0.0
-
- com.itgura.lms
- user-management
- 1.0.0
-
-
- com.itgura.lms
- user-management-all
-
-
- com.itgura.lms
- user-management-service
- 1.0.0
- compile
-
-
- com.itgura.lms
- lib-common
- 0.0.1
- compile
-
-
-
- 17
- 17
- UTF-8
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
\ No newline at end of file
diff --git a/user-management/user-management-all/src/main/java/com/itgura/UserMain.java b/user-management/user-management-all/src/main/java/com/itgura/UserMain.java
deleted file mode 100644
index 6f064a7..0000000
--- a/user-management/user-management-all/src/main/java/com/itgura/UserMain.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.itgura;
-import com.itgura.util.BootMain;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
-
-@EnableDiscoveryClient
-@SpringBootApplication
-public class UserMain {
- public static void main(String[] args) {
-
- BootMain.main(args);
- SpringApplication.run(UserMain.class);
- }
-}
\ No newline at end of file
diff --git a/user-management/user-management-all/src/main/java/com/itgura/config/SecurityConfiguration.java b/user-management/user-management-all/src/main/java/com/itgura/config/SecurityConfiguration.java
deleted file mode 100644
index 5c93bff..0000000
--- a/user-management/user-management-all/src/main/java/com/itgura/config/SecurityConfiguration.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.itgura.config;
-
-
-import com.itgura.enums.Role;
-import com.itgura.util.JwtService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-
-@Configuration
-@EnableWebSecurity
-@RequiredArgsConstructor
-public class SecurityConfiguration {
-
- private final JwtService jwtService;
-
- private final AuthenticationProvider authenticationProvider;
-
-
-
- @Bean
- public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-
- JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter();
- jwtAuthenticationFilter.setJwtService(jwtService);
-
- http.csrf(AbstractHttpConfigurer::disable)
- .authorizeHttpRequests(request->request.requestMatchers(
- "/api/v1/auth/**",
- "/v2/api-docs",
- "/configuration/ui",
- "/swagger-resources/**",
- "/configuration/security",
- "/swagger-ui.html",
- "/webjars/**")
-
- .permitAll()
- .requestMatchers("/api/v1/admin/**").hasAnyAuthority(Role.ADMIN.name())
- .requestMatchers("/api/v1/user/**").hasAnyAuthority(Role.USER.name())
- .anyRequest().authenticated())
-
- .sessionManagement(manager->manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
- .authenticationProvider(authenticationProvider)
- .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
-
-
-
- return http.build();
- }
-}
diff --git a/user-management/user-management-all/src/main/java/com/itgura/controller/sampleController.java b/user-management/user-management-all/src/main/java/com/itgura/controller/sampleController.java
deleted file mode 100644
index 90a6da6..0000000
--- a/user-management/user-management-all/src/main/java/com/itgura/controller/sampleController.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.itgura.controller;
-
-public class sampleController {
-}
diff --git a/user-management/user-management-all/src/main/resources/application.properties b/user-management/user-management-all/src/main/resources/application.properties
deleted file mode 100644
index 1d6e8c7..0000000
--- a/user-management/user-management-all/src/main/resources/application.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-server.port=8091
-spring.application.name=user-management
-logging.level.org.springframework.core.env=DEBUG
-spring.profiles.active=dev
diff --git a/user-management/user-management-dao/pom.xml b/user-management/user-management-dao/pom.xml
deleted file mode 100644
index d56c17e..0000000
--- a/user-management/user-management-dao/pom.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- 4.0.0
-
- com.itgura.lms
- user-management
- 1.0.0
-
-
- com.itgura.lms
- user-management-dao
-
-
- 17
- 17
- UTF-8
-
-
-
- com.itgura.lms
- lib-security
- 0.0.1
-
-
- com.itgura.lms
- lib-global
- 0.0.1
-
-
- org.apache.commons
- commons-lang3
- 3.14.0
-
-
-
- com.mysql
- mysql-connector-j
- 8.1.0
-
-
- org.postgresql
- postgresql
- 42.7.1
-
-
- org.projectlombok
- lombok
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
-
-
\ No newline at end of file
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/dto/request/AuthenticationRequest.java b/user-management/user-management-dao/src/main/java/com/itgura/dto/request/AuthenticationRequest.java
deleted file mode 100644
index 9825a49..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/dto/request/AuthenticationRequest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.itgura.dto.request;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class AuthenticationRequest {
- private String email;
- private String password;
-}
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/dto/request/RegisterRequest.java b/user-management/user-management-dao/src/main/java/com/itgura/dto/request/RegisterRequest.java
deleted file mode 100644
index cc3f167..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/dto/request/RegisterRequest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.itgura.dto.request;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class RegisterRequest {
- private String firstName;
- private String lastName;
- private String email;
-
- private String password;
-}
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/dto/response/AuthenticationResponse.java b/user-management/user-management-dao/src/main/java/com/itgura/dto/response/AuthenticationResponse.java
deleted file mode 100644
index 6439f2a..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/dto/response/AuthenticationResponse.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.itgura.dto.response;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class AuthenticationResponse {
- private String authenticationToken;
- private String refreshToken;
-}
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/entity/User.java b/user-management/user-management-dao/src/main/java/com/itgura/entity/User.java
deleted file mode 100644
index 8891c2d..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/entity/User.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.itgura.entity;
-
-import com.itgura.enums.Role;
-import jakarta.persistence.*;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.Collection;
-import java.util.List;
-
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-@Entity
-@Table(name = "_user")
-public class User implements UserDetails {
-
- @Id
- @GeneratedValue
- private Integer id;
- private String firstName;
- private String lastName;
- private String email;
- private String password;
- @Enumerated(EnumType.STRING)
- private Role role;
-
- @Override
- public Collection extends GrantedAuthority> getAuthorities() {
- return List.of(new SimpleGrantedAuthority(role.name()));
- }
-
- @Override
- public String getUsername() {
- return this.email;
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- @Override
- public boolean isEnabled() {
- return true;
- }
-
- @Override
- public String getPassword() {
- return this.password;
- }
-}
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/enums/Role.java b/user-management/user-management-dao/src/main/java/com/itgura/enums/Role.java
deleted file mode 100644
index 06a1f8b..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/enums/Role.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.itgura.enums;
-
-public enum Role {
- USER,
- ADMIN
-}
diff --git a/user-management/user-management-dao/src/main/java/com/itgura/repository/UserRepository.java b/user-management/user-management-dao/src/main/java/com/itgura/repository/UserRepository.java
deleted file mode 100644
index acf3dde..0000000
--- a/user-management/user-management-dao/src/main/java/com/itgura/repository/UserRepository.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.itgura.repository;
-
-
-import com.itgura.entity.User;
-import com.itgura.enums.Role;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.stereotype.Repository;
-
-import java.util.Optional;
-
-@Repository
-@EnableJpaRepositories
-public interface UserRepository extends JpaRepository {
-
-
- Optional findByEmail(String email);
- Optional findByRole(Role role);
-}
diff --git a/user-management/user-management-dao/src/main/resources/application-prod.properties b/user-management/user-management-dao/src/main/resources/application-prod.properties
deleted file mode 100644
index 973b78c..0000000
--- a/user-management/user-management-dao/src/main/resources/application-prod.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-
-spring.datasource.url=jdbc:postgresql://dpg-cp2qofi1hbls738314e0-a.oregon-postgres.render.com:5432/itgura
-spring.datasource.username= it_gura_user
-spring.datasource.password= lsbflvJ0HfdVIgbHNbCEZnzV3o9SAErn
-spring.datasource.hikari.schema=resource_management
-spring.datasource.driver-class-name=org.postgresql.Driver
-
-# Hibernate/JPA properties
-spring.jpa.show-sql=true
-
-
-spring.jpa.hibernate.ddl-auto = update
-spring.sql.init.mode=always
-spring.jpa.generate-ddl=true
-spring.jpa.open-in-view=false
-spring.jpa.properties.hibernate.schema_update.unique_constraint_strategy=RECREATE_QUIETLY
-#spring.jpa.hibernate.ddl-auto=create
-spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
-
-spring.security.user.name=user
-spring.security.user.password=user
-
-spring.datasource.hikari.maximum-pool-size=10000
-spring.datasource.hikari.minimum-idle= 10
-spring.datasource.hikari.idle-timeout= 120000
-spring.datasource.hikari.connectionTimeout= 5000
diff --git a/user-management/user-management-service/pom.xml b/user-management/user-management-service/pom.xml
deleted file mode 100644
index d6a82bc..0000000
--- a/user-management/user-management-service/pom.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
- 4.0.0
-
- com.itgura.lms
- user-management
- 1.0.0
-
-
- com.itgura.lms
- user-management-service
-
-
- com.itgura.lms
- user-management-dao
- 1.0.0
- compile
-
-
-
-
- 17
- 17
- UTF-8
-
-
-
\ No newline at end of file
diff --git a/user-management/user-management-service/src/main/java/com/itgura/service/AuthenticationService.java b/user-management/user-management-service/src/main/java/com/itgura/service/AuthenticationService.java
deleted file mode 100644
index 4f5c144..0000000
--- a/user-management/user-management-service/src/main/java/com/itgura/service/AuthenticationService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.itgura.service;
-
-import com.itgura.dto.request.AuthenticationRequest;
-import com.itgura.dto.request.RegisterRequest;
-import com.itgura.dto.response.AuthenticationResponse;
-
-public interface AuthenticationService {
- public AuthenticationResponse register(RegisterRequest registerRequest);
- public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest);
- public AuthenticationResponse refreshToken(String refreshToken);
-}
diff --git a/user-management/user-management-service/src/main/java/com/itgura/service/impl/AuthenticationServiceImpl.java b/user-management/user-management-service/src/main/java/com/itgura/service/impl/AuthenticationServiceImpl.java
deleted file mode 100644
index 10485fc..0000000
--- a/user-management/user-management-service/src/main/java/com/itgura/service/impl/AuthenticationServiceImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.itgura.service.impl;
-
-import com.itgura.dto.request.AuthenticationRequest;
-import com.itgura.dto.request.RegisterRequest;
-import com.itgura.dto.response.AuthenticationResponse;
-import com.itgura.entity.User;
-import com.itgura.enums.Role;
-import com.itgura.repository.UserRepository;
-import com.itgura.service.AuthenticationService;
-import com.itgura.util.JwtService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-
-@Service
-@RequiredArgsConstructor
-public class AuthenticationServiceImpl implements AuthenticationService {
- private final UserRepository userRepository;
- private final PasswordEncoder passwordEncoder;
- private final JwtService jwtService;
- private final AuthenticationManager authenticationManager;
- @Override
- public AuthenticationResponse register(RegisterRequest registerRequest) {
- var user = User.builder()
- .firstName(registerRequest.getFirstName())
- .lastName(registerRequest.getLastName())
- .email(registerRequest.getEmail())
- .password(passwordEncoder.encode(registerRequest.getPassword()))
- .role(Role.USER)
- .build();
- userRepository.save(user);
- var jwtToken = jwtService.generateToken(user);
- return AuthenticationResponse.builder()
- .authenticationToken(jwtToken)
- .build();
- }
-
- @Override
- public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest) {
- authenticationManager.authenticate(
- new UsernamePasswordAuthenticationToken(authenticationRequest.getEmail(), authenticationRequest.getPassword())
- );
- var user = userRepository.findByEmail(authenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Invalid email or password"));
- var jwtToken = jwtService.generateToken(user);
- var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
- return AuthenticationResponse.builder()
- .authenticationToken(jwtToken)
- .refreshToken(refreshToken)
- .build();
- }
-
- @Override
- public AuthenticationResponse refreshToken(String refreshToken) {
-// var user = userRepository.findByEmail( )
-// var jwtToken = jwtService.generateToken(user);
-// return AuthenticationResponse.builder()
-// .authenticationToken(jwtToken)
-// .build();
- return null;
- }
-
-@Bean
- public UserDetailsService userDetailsService() {
- return username -> userRepository.findByEmail(username)
- .orElseThrow(() -> new UsernameNotFoundException("User not found"));
- }
-
- @Bean
- public AuthenticationProvider authenticationProvider(){
- DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
- provider.setUserDetailsService(userDetailsService());
- provider.setPasswordEncoder(passwordEncoder());
- return provider;
- }
- @Bean
- public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
- return config.getAuthenticationManager();
- }
-
-@Bean
- public PasswordEncoder passwordEncoder(){
- return new BCryptPasswordEncoder();
- }
-}
From 1aed5646cc4c87f7ff25d06206351c61e50969da Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Mon, 29 Jul 2024 10:25:42 +0530
Subject: [PATCH 02/11] Update docker-compose.yml
---
docker-compose.yml | 96 +++++++++++++++++++++++-----------------------
1 file changed, 48 insertions(+), 48 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index a1ea3ae..15ab110 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -118,50 +118,50 @@ services:
networks:
- spring
- alfresco:
- container_name: alfresco
- image: alfresco/alfresco-content-repository-community:latest
- environment:
- JAVA_OPTS: "
- -Ddb.driver=org.postgresql.Driver
- -Ddb.username=postgres
- -Ddb.password=root
- -Ddb.url=jdbc:postgresql://postgres-main/alfresco
- -Dsolr.host=solr6
- -Dsolr.port=8983
- -Dsolr.secureComms=none
- -Dsolr.base.url=/solr
- -Dindex.subsystem.name=solr6
- -Dalfresco.host=localhost
- -Dalfresco.port=8080
- -Dalfresco.context=alfresco
- -Dalfresco.protocol=http"
- ports:
- - "8080:8080"
- depends_on:
- - postgres-main
- - solr6
- networks:
- - spring
- - postgres-main
- volumes:
- - ./keystore:/opt/alfresco-search-services/solrhome/alfresco/keystore
- - ./config/alfresco-global.properties:/usr/local/tomcat/shared/classes/alfresco-global.properties
- - ./config/solrcore.properties:/usr/local/tomcat/shared/classes/solrcore.properties
- solr6:
- container_name: solr6
- image: alfresco/alfresco-search-services:2.0.11
- environment:
- SOLR_ALFRESCO_HOST: "alfresco"
- SOLR_ALFRESCO_PORT: "8080"
- SOLR_SOLR_HOST: "solr6"
- SOLR_SOLR_PORT: "8983"
- SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
- ports:
- - "8983:8983"
- networks:
- - spring
- - postgres-main
+# alfresco:
+# container_name: alfresco
+# image: alfresco/alfresco-content-repository-community:latest
+# environment:
+# JAVA_OPTS: "
+# -Ddb.driver=org.postgresql.Driver
+# -Ddb.username=postgres
+# -Ddb.password=root
+# -Ddb.url=jdbc:postgresql://postgres-main/alfresco
+# -Dsolr.host=solr6
+# -Dsolr.port=8983
+# -Dsolr.secureComms=none
+# -Dsolr.base.url=/solr
+# -Dindex.subsystem.name=solr6
+# -Dalfresco.host=localhost
+# -Dalfresco.port=8080
+# -Dalfresco.context=alfresco
+# -Dalfresco.protocol=http"
+# ports:
+# - "8080:8080"
+# depends_on:
+# - postgres-main
+# - solr6
+# networks:
+# - spring
+# - postgres-main
+# volumes:
+# - ./keystore:/opt/alfresco-search-services/solrhome/alfresco/keystore
+# - ./config/alfresco-global.properties:/usr/local/tomcat/shared/classes/alfresco-global.properties
+# - ./config/solrcore.properties:/usr/local/tomcat/shared/classes/solrcore.properties
+# solr6:
+# container_name: solr6
+# image: alfresco/alfresco-search-services:2.0.11
+# environment:
+# SOLR_ALFRESCO_HOST: "alfresco"
+# SOLR_ALFRESCO_PORT: "8080"
+# SOLR_SOLR_HOST: "solr6"
+# SOLR_SOLR_PORT: "8983"
+# SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
+# ports:
+# - "8983:8983"
+# networks:
+# - spring
+# - postgres-main
networks:
postgres-main:
@@ -172,10 +172,10 @@ networks:
volumes:
postgres:
pgadmin:
- alfresco-data:
- driver: local
- solr-data:
- driver: local
+# alfresco-data:
+# driver: local
+# solr-data:
+# driver: local
##commands
# mvn clean package -P build-docker-image
From 202d61d47b47cd05f0c33518ee07cb92a263b1bf Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Mon, 29 Jul 2024 11:05:54 +0530
Subject: [PATCH 03/11] Create dockerHub-publish.yml
---
.github/workflows/dockerHub-publish.yml | 49 +++++++++++++++++++++++++
1 file changed, 49 insertions(+)
create mode 100644 .github/workflows/dockerHub-publish.yml
diff --git a/.github/workflows/dockerHub-publish.yml b/.github/workflows/dockerHub-publish.yml
new file mode 100644
index 0000000..cc2fd13
--- /dev/null
+++ b/.github/workflows/dockerHub-publish.yml
@@ -0,0 +1,49 @@
+name: CI/CD Pipeline
+
+on:
+ push:
+ branches:
+ - dev-yesitha
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v2
+ with:
+ distribution: 'adopt'
+ java-version: '17'
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_HUB_USERNAME }}
+ password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
+
+ - name: Build and publish Docker image
+ run: mvn clean package -P build-docker-image
+ env:
+ DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
+ DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
+
+ # deploy:
+ # needs: build
+ # runs-on: ubuntu-latest
+
+ # steps:
+ # - name: Checkout code
+ # uses: actions/checkout@v2
+
+ # - name: Deploy to Server
+ # run: |
+ # ssh user@your-server "docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:latest && docker-compose up -d"
+ # env:
+ # DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
+ # DOCKER_HUB_ACCESS_TOKEN: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
+ # SERVER_SSH_USERNAME: ${{ secrets.SERVER_SSH_USERNAME }}
+ # SERVER_SSH_PASSWORD: ${{ secrets.SERVER_SSH_PASSWORD }}
From 54eb6e9cd6c7b5071f6e1c5b04b7b11ae75de6cf Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Mon, 29 Jul 2024 11:41:26 +0530
Subject: [PATCH 04/11] Update dockerHub-publish.yml
---
.github/workflows/dockerHub-publish.yml | 28 +++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/.github/workflows/dockerHub-publish.yml b/.github/workflows/dockerHub-publish.yml
index cc2fd13..a538212 100644
--- a/.github/workflows/dockerHub-publish.yml
+++ b/.github/workflows/dockerHub-publish.yml
@@ -9,6 +9,17 @@ jobs:
build:
runs-on: ubuntu-latest
+ services:
+ db:
+ image: postgres
+ env:
+ POSTGRES_DB: itgura
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: root
+ ports:
+ - 5432:5432
+ options: --health-cmd "pg_isready -U postgres" --health-interval 10s --health-timeout 5s --health-retries 5
+
steps:
- name: Checkout code
uses: actions/checkout@v2
@@ -19,6 +30,23 @@ jobs:
distribution: 'adopt'
java-version: '17'
+ - name: Wait for PostgreSQL
+ run: |
+ echo "Waiting for PostgreSQL to be ready..."
+ until pg_isready -h localhost -p 5432 -U postgres; do
+ sleep 1
+ done
+
+ - name: Initialize Database
+ run: |
+ psql -v ON_ERROR_STOP=1 --host=localhost --username=postgres --dbname=itgura <<-EOSQL
+ CREATE SCHEMA resource_management;
+ CREATE SCHEMA payment_service;
+ CREATE SCHEMA auth_service;
+ EOSQL
+ env:
+ PGPASSWORD: root
+
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
From 044713e58645b4d8a29d812e646e0cd10445362c Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Tue, 13 Aug 2024 17:14:25 +0530
Subject: [PATCH 05/11] security error fix
---
.../config/JwtAuthenticationFilter.java | 23 ++++++++++---------
.../controller/AdminController.java | 12 +++++++---
docker-compose.yml | 2 +-
3 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/JwtAuthenticationFilter.java b/auth-service/src/main/java/com/itgura/authservice/config/JwtAuthenticationFilter.java
index 4472343..2c2d5b2 100644
--- a/auth-service/src/main/java/com/itgura/authservice/config/JwtAuthenticationFilter.java
+++ b/auth-service/src/main/java/com/itgura/authservice/config/JwtAuthenticationFilter.java
@@ -36,23 +36,24 @@ protected void doFilterInternal(@NonNull HttpServletRequest request,
final String authHeader = request.getHeader("Authorization");
final String jwt;
final String userEmail;
- if(StringUtils.isEmpty(authHeader) || StringUtils.startsWith(authHeader,"Bearer ")){
+
+ if (StringUtils.isEmpty(authHeader) || !StringUtils.startsWith(authHeader, "Bearer ")) {
filterChain.doFilter(request, response);
return;
}
jwt = authHeader.substring(7);//Bearer length is 7
userEmail = jwtService.extractUserName(jwt);//todo extract userEmail from jwt Token
-if(StringUtils.isNotEmpty(userEmail) && SecurityContextHolder.getContext().getAuthentication() == null){
- UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
- if(jwtService.isTokenValid(jwt, userDetails)){
- UsernamePasswordAuthenticationToken authToken =new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
- authToken.setDetails(
- new WebAuthenticationDetailsSource().buildDetails(request)
- );
- SecurityContextHolder.getContext().setAuthentication(authToken);
- }
+ if (StringUtils.isNotEmpty(userEmail) && SecurityContextHolder.getContext().getAuthentication() == null) {
+ UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
+ if (jwtService.isTokenValid(jwt, userDetails)) {
+ UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+ authToken.setDetails(
+ new WebAuthenticationDetailsSource().buildDetails(request)
+ );
+ SecurityContextHolder.getContext().setAuthentication(authToken);
+ }
}
- filterChain.doFilter(request,response);
+ filterChain.doFilter(request, response);
}
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/AdminController.java b/auth-service/src/main/java/com/itgura/authservice/controller/AdminController.java
index 8f9f9db..f73c511 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/AdminController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/AdminController.java
@@ -1,13 +1,19 @@
package com.itgura.authservice.controller;
import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping("api/v1/admin")
-@RequiredArgsConstructor
+
public class AdminController {
+ @PostMapping("/testAdmin")
+ public ResponseEntity seyHello() {
+ return ResponseEntity.ok("Hello from Admin Controller!");
+ }
+
}
diff --git a/docker-compose.yml b/docker-compose.yml
index 15ab110..fded88a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -114,7 +114,7 @@ services:
- ALFRESCO_BASE_URL=http://alfresco:8080
depends_on:
- eureka-server
- - alfresco
+# - alfresco
networks:
- spring
From ec42a270b751bd25f8040c8783987a1b03aa911b Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Wed, 14 Aug 2024 15:45:41 +0530
Subject: [PATCH 06/11] change alfresco to nextCloud
---
.../resources/application-docker.properties | 35 +++--
.../resources/application-kube.properties | 33 +++--
.../main/resources/application-dev.properties | 32 +++--
.../resources/application-prod.properties | 34 +++--
.../main/resources/application-stg.properties | 36 ++++--
.../service/config/AlfrescoConfig.java | 107 ----------------
.../service/config/NextCloudConfig.java | 100 +++++++++++++++
.../service/impl/DmsServiceImpl.java | 83 ++++++------
docker-compose.yml | 121 ++++++++++++------
init-db.sh | 6 +
10 files changed, 350 insertions(+), 237 deletions(-)
delete mode 100644 dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/AlfrescoConfig.java
create mode 100644 dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/NextCloudConfig.java
create mode 100644 init-db.sh
diff --git a/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties b/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
index 69ad14d..4586757 100644
--- a/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
+++ b/dms-mediator/dms-mediator-all/src/main/resources/application-docker.properties
@@ -5,15 +5,32 @@ spring.application.name=dms-mediator
spring.servlet.multipart.max-file-size=35MB
spring.servlet.multipart.max-request-size=35MB
-# Alfresco
-alfresco.base.url=http://alfresco:8080/alfresco
-
-alfresco.username=admin
-alfresco.password=admin
-alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
-alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
-alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
-alfresco.uploadRelativePath=/dms
+## Alfresco
+#alfresco.base.url=http://alfresco:8080/alfresco
+#
+#alfresco.username=admin
+#alfresco.password=admin
+#alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+#alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+#alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+#alfresco.uploadRelativePath=/dms
+# Nextcloud
+nextcloud.base.url=http://nextcloud:8080
+nextcloud.username=admin
+nextcloud.password=admin
+
+
+# Upload URL Template
+nextcloud.uploadUrl=/remote.php/dav/files/{username}/{path}
+
+# Download URL Template
+nextcloud.downloadUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Delete URL Template
+nextcloud.deleteUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Relative Path for Uploads
+nextcloud.uploadRelativePath=/dms
#alfresco.base.url=http://192.168.1.87:8080/alfresco
diff --git a/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties b/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
index 855bc27..79f8bdb 100644
--- a/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
+++ b/dms-mediator/dms-mediator-all/src/main/resources/application-kube.properties
@@ -5,15 +5,30 @@ spring.application.name=dms-mediator
spring.servlet.multipart.max-file-size=35MB
spring.servlet.multipart.max-request-size=35MB
-# Alfresco
-alfresco.base.url=http://alfresco:8080/alfresco
-
-alfresco.username=admin
-alfresco.password=admin
-alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
-alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
-alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
-alfresco.uploadRelativePath=/dms
+## Alfresco
+#alfresco.base.url=http://alfresco:8080/alfresco
+#
+#alfresco.username=admin
+#alfresco.password=admin
+#alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+#alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+#alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+#alfresco.uploadRelativePath=/dms
+# Nextcloud
+nextcloud.base.url=http://nextcloud:8080
+nextcloud.username=admin
+nextcloud.password=admin
+# Upload URL
+nextcloud.uploadUrl=/remote.php/dav/files/{username}/{path}
+
+# Download URL
+nextcloud.downloadUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Delete URL
+nextcloud.deleteUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Relative Path for Uploads
+nextcloud.uploadRelativePath=/dms
#alfresco.base.url=http://192.168.1.87:8080/alfresco
diff --git a/dms-mediator/dms-mediator-dao/src/main/resources/application-dev.properties b/dms-mediator/dms-mediator-dao/src/main/resources/application-dev.properties
index cca3956..f21c5d4 100644
--- a/dms-mediator/dms-mediator-dao/src/main/resources/application-dev.properties
+++ b/dms-mediator/dms-mediator-dao/src/main/resources/application-dev.properties
@@ -1,14 +1,30 @@
spring.servlet.multipart.max-file-size=35MB
spring.servlet.multipart.max-request-size=35MB
# Alfresco
-alfresco.base.url=http://localhost:8080/alfresco
-
-alfresco.username=admin
-alfresco.password=admin
-alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
-alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
-alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
-alfresco.uploadRelativePath=/dms
+#alfresco.base.url=http://localhost:8080/alfresco
+#
+#alfresco.username=admin
+#alfresco.password=admin
+#alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+#alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+#alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+#alfresco.uploadRelativePath=/dms
+
+# Nextcloud
+nextcloud.base.url=http://localhost:8080
+nextcloud.username=admin
+nextcloud.password=admin
+# Upload URL
+nextcloud.uploadUrl=/remote.php/dav/files/{username}/{path}
+
+# Download URL
+nextcloud.downloadUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Delete URL
+nextcloud.deleteUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Relative Path for Uploads
+nextcloud.uploadRelativePath=/dms
#alfresco.base.url=http://192.168.1.87:8080/alfresco
diff --git a/dms-mediator/dms-mediator-dao/src/main/resources/application-prod.properties b/dms-mediator/dms-mediator-dao/src/main/resources/application-prod.properties
index 5d47cca..7cc8996 100644
--- a/dms-mediator/dms-mediator-dao/src/main/resources/application-prod.properties
+++ b/dms-mediator/dms-mediator-dao/src/main/resources/application-prod.properties
@@ -1,13 +1,29 @@
spring.servlet.multipart.max-file-size=35MB
spring.servlet.multipart.max-request-size=35MB
-# Alfresco
-alfresco.base.url=http://localhost:8080/alfresco
-
-alfresco.username=admin
-alfresco.password=admin
-alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
-alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
-alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
-alfresco.uploadRelativePath=/dms
+## Alfresco
+#alfresco.base.url=http://localhost:8080/alfresco
+#
+#alfresco.username=admin
+#alfresco.password=admin
+#alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+#alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+#alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+#alfresco.uploadRelativePath=/dms
+
+# Nextcloud
+nextcloud.base.url=http://localhost:8080
+nextcloud.username=admin
+nextcloud.password=admin
+# Upload URL
+nextcloud.uploadUrl=/remote.php/dav/files/{username}/{path}
+
+# Download URL
+nextcloud.downloadUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Delete URL
+nextcloud.deleteUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Relative Path for Uploads
+nextcloud.uploadRelativePath=/dms
#alfresco.base.url=http://192.168.1.87:8080/alfresco
diff --git a/dms-mediator/dms-mediator-dao/src/main/resources/application-stg.properties b/dms-mediator/dms-mediator-dao/src/main/resources/application-stg.properties
index ef561de..552dc40 100644
--- a/dms-mediator/dms-mediator-dao/src/main/resources/application-stg.properties
+++ b/dms-mediator/dms-mediator-dao/src/main/resources/application-stg.properties
@@ -1,14 +1,32 @@
spring.servlet.multipart.max-file-size=35MB
spring.servlet.multipart.max-request-size=35MB
-# Alfresco
-alfresco.base.url=http://localhost:8080/alfresco
-
-alfresco.username=admin
-alfresco.password=admin
-alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
-alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
-alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
-alfresco.uploadRelativePath=/dms
+## Alfresco
+#alfresco.base.url=http://localhost:8080/alfresco
+#
+#alfresco.username=admin
+#alfresco.password=admin
+#alfresco.uploadUrl=/api/-default-/public/alfresco/versions/1/nodes/-my-/children?fields=id,parentId,name
+#alfresco.downloadUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}/content
+#alfresco.deleteUrl=/api/-default-/public/alfresco/versions/1/nodes/{0}?permanent=true
+#alfresco.uploadRelativePath=/dms
+# Nextcloud
+nextcloud.base.url=http://localhost:8080
+nextcloud.username=admin
+nextcloud.password=admin
+
+# Upload URL Template
+nextcloud.uploadUrl=/remote.php/dav/files/{username}/{path}
+
+# Download URL Template
+nextcloud.downloadUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Delete URL Template
+nextcloud.deleteUrl=/remote.php/dav/files/{username}/{path}/{filename}
+
+# Relative Path for Uploads
+nextcloud.uploadRelativePath=/dms
+
+
#alfresco.base.url=http://192.168.1.87:8080/alfresco
diff --git a/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/AlfrescoConfig.java b/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/AlfrescoConfig.java
deleted file mode 100644
index 11e6389..0000000
--- a/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/AlfrescoConfig.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.itgura.dms_mediator.service.config;
-
-
-
-import com.itgura.dms_mediator.util.DummyEntityManagerFactory;
-import jakarta.persistence.EntityManagerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.client.RestTemplateBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.client.RestTemplate;
-
-@Configuration
-
-
-public class AlfrescoConfig {
- @Value("${alfresco.base.url}")
- private String alfrescoBaseUrl;
-
- @Value("${alfresco.uploadUrl}")
- private String uploadUrl;
-
- @Value("${alfresco.downloadUrl}")
- private String downloadUrl;
-
- @Value("${alfresco.deleteUrl}")
- private String deleteUrl;
-
-
- @Value("${alfresco.username}")
- private String username;
-
- @Value("${alfresco.password}")
- private String password;
-
- @Value("${alfresco.uploadRelativePath}")
- private String uploadRelativePath;
-
- public String getUploadRelativePath() {
- return uploadRelativePath;
- }
-
- public void setUploadRelativePath(String uploadRelativePath) {
- this.uploadRelativePath = uploadRelativePath;
- }
-
- @Bean
- public RestTemplate restTemplate(RestTemplateBuilder builder) {
- return builder
- .basicAuthentication(username, password)
- .build();
- }
-
- public String getDownloadUrl() {
- return downloadUrl;
- }
-
- public void setDownloadUrl(String downloadUrl) {
- this.downloadUrl = downloadUrl;
- }
-
- public String getDeleteUrl() {
- return deleteUrl;
- }
-
- public void setDeleteUrl(String deleteUrl) {
- this.deleteUrl = deleteUrl;
- }
-
- public String getAlfrescoBaseUrl() {
- return alfrescoBaseUrl;
- }
-
- public void setAlfrescoBaseUrl(String alfrescoBaseUrl) {
- this.alfrescoBaseUrl = alfrescoBaseUrl;
- }
-
- public String getUploadUrl() {
- return uploadUrl;
- }
-
- public void setUploadUrl(String uploadUrl) {
- this.uploadUrl = uploadUrl;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- @Bean
- public EntityManagerFactory entityManagerFactory() {
- // Implement a dummy EntityManagerFactory
- return new DummyEntityManagerFactory();
- }
-}
diff --git a/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/NextCloudConfig.java b/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/NextCloudConfig.java
new file mode 100644
index 0000000..f59f1b4
--- /dev/null
+++ b/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/config/NextCloudConfig.java
@@ -0,0 +1,100 @@
+package com.itgura.dms_mediator.service.config;
+
+
+
+import com.itgura.dms_mediator.util.DummyEntityManagerFactory;
+import jakarta.persistence.EntityManagerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+
+
+public class NextCloudConfig {
+ @Value("${nextcloud.base.url}")
+ private String nextcloudBaseUrl;
+
+ @Value("${nextcloud.uploadUrl}")
+ private String uploadUrlTemplate;
+
+ @Value("${nextcloud.downloadUrl}")
+ private String downloadUrlTemplate;
+
+ @Value("${nextcloud.deleteUrl}")
+ private String deleteUrlTemplate;
+
+
+ @Value("${nextcloud.username}")
+ private String username;
+
+ @Value("${nextcloud.password}")
+ private String password;
+
+ @Value("${nextcloud.uploadRelativePath}")
+ private String uploadRelativePath;
+
+
+
+ @Bean
+ public RestTemplate restTemplate(RestTemplateBuilder builder) {
+ return builder
+ .basicAuthentication(username, password)
+ .build();
+ }
+
+ public String buildUploadUrl(String path) {
+ return nextcloudBaseUrl + uploadUrlTemplate
+ .replace("{username}", username)
+ .replace("{path}", path.startsWith("/") ? path.substring(1) : path);
+ }
+
+ public String buildDownloadUrl(String path, String filename) {
+ return nextcloudBaseUrl + downloadUrlTemplate
+ .replace("{username}", username)
+ .replace("{path}", path.startsWith("/") ? path.substring(1) : path)
+ .replace("{filename}", filename);
+ }
+
+ public String buildDeleteUrl(String path, String filename) {
+ return nextcloudBaseUrl + deleteUrlTemplate
+ .replace("{username}", username)
+ .replace("{path}", path.startsWith("/") ? path.substring(1) : path)
+ .replace("{filename}", filename);
+ }
+ public String getNextcloudBaseUrl() {
+ return nextcloudBaseUrl;
+ }
+
+ public String getUploadUrlTemplate() {
+ return uploadUrlTemplate;
+ }
+
+ public String getDownloadUrlTemplate() {
+ return downloadUrlTemplate;
+ }
+
+ public String getDeleteUrlTemplate() {
+ return deleteUrlTemplate;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public String getUploadRelativePath() {
+ return uploadRelativePath;
+ }
+ @Bean
+ public EntityManagerFactory entityManagerFactory() {
+ // Implement a dummy EntityManagerFactory
+ return new DummyEntityManagerFactory();
+ }
+
+}
diff --git a/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/impl/DmsServiceImpl.java b/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/impl/DmsServiceImpl.java
index 9ef34c0..f9cfcc1 100644
--- a/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/impl/DmsServiceImpl.java
+++ b/dms-mediator/dms-mediator-service/src/main/java/com/itgura/dms_mediator/service/impl/DmsServiceImpl.java
@@ -1,7 +1,7 @@
package com.itgura.dms_mediator.service.impl;
import com.itgura.dms_mediator.response.dto.DocumentResponseDto;
import com.itgura.dms_mediator.service.DmsService;
-import com.itgura.dms_mediator.service.config.AlfrescoConfig;
+import com.itgura.dms_mediator.service.config.NextCloudConfig;
import com.itgura.exception.ApplicationException;
import com.itgura.exception.ValueNotFoundException;
import org.json.JSONObject;
@@ -20,6 +20,7 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.text.MessageFormat;
import java.util.Base64;
import java.util.UUID;
@@ -32,7 +33,7 @@ public class DmsServiceImpl implements DmsService {
private RestTemplate restTemplate;
@Autowired
- private AlfrescoConfig config;
+ private NextCloudConfig config;
@Override
@@ -40,11 +41,7 @@ public String uploadDocument(MultipartFile file) throws ApplicationException {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(config.getUsername(), config.getPassword());
- StringBuilder urlString = new StringBuilder();
- urlString.append(config.getAlfrescoBaseUrl() + config.getUploadUrl());
-
try {
-//
// Generate a unique file name by appending _id_[Random UUID]
String originalFileName = file.getOriginalFilename();
@@ -52,101 +49,93 @@ public String uploadDocument(MultipartFile file) throws ApplicationException {
String baseName = originalFileName.substring(0, originalFileName.lastIndexOf("."));
String uniqueFileName = baseName + "_id_" + UUID.randomUUID() + extension;
- // Convert multipart file to File with unique file name
+ // Build the upload URL
+ String path = config.getUploadRelativePath();
+ String uploadUrl = config.buildUploadUrl(path + "/" + uniqueFileName);
+ System.out.println("uploadUrl: " + uploadUrl);
+
+ // Convert MultipartFile to a File
File tempFile = convertMultiPartToFile(file, uniqueFileName);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.setContentLength(tempFile.length());
-//
- MultiValueMap fileValueMap = new LinkedMultiValueMap<>();
-
- fileValueMap.add("filedata", new FileSystemResource(tempFile));
- fileValueMap.add("relativePath", config.getUploadRelativePath());
- fileValueMap.add("name", uniqueFileName);
- HttpEntity> entity = new HttpEntity<>(fileValueMap,
- headers);
+ // Create a resource for the file to be uploaded
+ FileSystemResource resource = new FileSystemResource(tempFile);
+ // Use RestTemplate to upload the file
+ HttpEntity entity = new HttpEntity<>(resource, headers);
RestTemplate restTemplate = new RestTemplate();
- ResponseEntity responseEntity = restTemplate.exchange(urlString.toString(), HttpMethod.POST, entity,
- String.class);
-
+ ResponseEntity responseEntity = restTemplate.exchange(uploadUrl, HttpMethod.PUT, entity, String.class);
+ // Clean up temporary file
tempFile.delete();
-
- JSONObject jsonResponse = new JSONObject(responseEntity.getBody());
- String alfrescoDocumentId = jsonResponse.getJSONObject("entry").getString("id");
-
- if (alfrescoDocumentId != null) {
- return alfrescoDocumentId;
+ // Check for successful response
+ if (responseEntity.getStatusCode().is2xxSuccessful()) {
+ return uniqueFileName; // Return the unique file name or path as a reference ID
} else {
- throw new ApplicationException("Failed to upload document to Alfresco: " + responseEntity.getStatusCode());
+ throw new ApplicationException("Failed to upload document to Nextcloud: " + responseEntity.getStatusCode());
}
} catch (Exception e) {
throw new ApplicationException("Exception: " + e.getMessage(), e);
}
-
}
-
@Override
- public DocumentResponseDto downloadDocument(String alfrescoDocumentId) throws ValueNotFoundException, ApplicationException {
+ public DocumentResponseDto downloadDocument(String documentPath) throws ValueNotFoundException, ApplicationException {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(config.getUsername().trim(), config.getPassword());
- // URL to access the document content
- String fileUrl = config.getAlfrescoBaseUrl() + config.getDownloadUrl();
- StringBuilder urlString = new StringBuilder();
- urlString.append(MessageFormat.format(fileUrl, alfrescoDocumentId));
+ // Build the URL to access the document content
+ String downloadUrl = config.buildDownloadUrl(config.getUploadRelativePath(), documentPath);
+ System.out.println("downloadUrl: " + downloadUrl);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
ResponseEntity response;
try {
response = restTemplate.exchange(
- urlString.toString(),
+ downloadUrl,
HttpMethod.GET,
new HttpEntity<>(headers),
Resource.class);
} catch (HttpClientErrorException e) {
-
if (e.getStatusCode().equals(HttpStatus.NOT_FOUND)) {
throw new ValueNotFoundException("Document not found: " + e.getStatusCode());
} else {
throw new ApplicationException("Client error during document download: " + e.getStatusCode());
}
} catch (HttpServerErrorException e) {
-
throw new ApplicationException("Server error during document download: " + e.getStatusCode());
}
if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
+ Resource resource = response.getBody();
+ String base64Content = convertResourceToBase64(resource);
- Resource imageResource = response.getBody();
- String base64Image = convertResourceToBase64(imageResource);
- // Extract filename from 'Content-Disposition' header if available
+ // Extract filename from 'Content-Disposition' header if available, or use documentPath
String filename = extractOriginalFileName(response.getHeaders().getContentDisposition().getFilename());
- return new DocumentResponseDto(base64Image, filename);
+
+ return new DocumentResponseDto(base64Content, filename);
} else {
// Handle unexpected scenarios
+ System.out.println(response);
throw new ApplicationException("Unexpected error during document download: " + response.getStatusCode());
}
}
@Override
- public String deleteDocument(String alfrescoDocumentId) throws ApplicationException, ValueNotFoundException {
+ public String deleteDocument(String documentPath) throws ApplicationException, ValueNotFoundException {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(config.getUsername(), config.getPassword());
- // Include the 'permanent=true' query parameter in the delete URL
- String deleteUrl = config.getAlfrescoBaseUrl() + config.getDeleteUrl();
- StringBuilder urlString = new StringBuilder();
- urlString.append(MessageFormat.format(deleteUrl, alfrescoDocumentId));
+ // Build the delete URL using the document path
+ String deleteUrl = config.buildDeleteUrl(config.getUploadRelativePath(), documentPath);
try {
- restTemplate.exchange(urlString.toString(), HttpMethod.DELETE, new HttpEntity<>(headers), String.class);
- return "Document with ID: " + alfrescoDocumentId + " deleted successfully.";
+ restTemplate.exchange(deleteUrl, HttpMethod.DELETE, new HttpEntity<>(headers), String.class);
+ return "Document at path: " + documentPath + " deleted successfully.";
} catch (HttpClientErrorException.NotFound e) {
- throw new ValueNotFoundException("Document not found with ID: " + alfrescoDocumentId);
+ throw new ValueNotFoundException("Document not found at path: " + documentPath);
} catch (HttpClientErrorException e) {
throw new ApplicationException("Client error during document deletion: " + e.getMessage());
} catch (HttpServerErrorException e) {
diff --git a/docker-compose.yml b/docker-compose.yml
index fded88a..4784b6f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,10 +9,14 @@ services:
POSTGRES_PASSWORD: root
POSTGRES_DB: itgura
PGDATA: /data/postgres
+
+
volumes:
+ - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
- postgres:/data/postgres
networks:
- postgres-main
+ - nextcloud-network
restart: unless-stopped
pgadmin:
@@ -111,71 +115,110 @@ services:
- SPRING_PROFILES_ACTIVE=docker
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
- EUREKA_INSTANCE_HOSTNAME=dms-mediator
- - ALFRESCO_BASE_URL=http://alfresco:8080
+ - NEXTCLOUD_BASE_URL=http://nextcloud:8080
depends_on:
- eureka-server
-# - alfresco
+ - nextcloud
+ - postgres-main
+
+ networks:
+ - spring
+ - nextcloud-network
+
+ nextcloud:
+ image: nextcloud:latest
+ container_name: nextcloud
+ ports:
+ - "8080:80"
+ volumes:
+ - nextcloud_data:/var/www/html
+ environment:
+ - POSTGRES_DB=alfresco
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=root
+ - POSTGRES_HOST=postgres-main
+ depends_on:
+ - postgres-main
networks:
- spring
+ - nextcloud-network
# alfresco:
-# container_name: alfresco
-# image: alfresco/alfresco-content-repository-community:latest
+# image: docker.io/alfresco/alfresco-content-repository-community:23.2.1
+# mem_limit: 1900m
# environment:
-# JAVA_OPTS: "
+# JAVA_TOOL_OPTIONS: >-
+# -Dencryption.keystore.type=JCEKS
+# -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding
+# -Dencryption.keyAlgorithm=DESede
+# -Dencryption.keystore.location=/usr/local/tomcat/shared/classes/alfresco/extension/keystore/keystore
+# -Dmetadata-keystore.password=mp6yc0UD9e
+# -Dmetadata-keystore.aliases=metadata
+# -Dmetadata-keystore.metadata.password=oKIWzVdEdA
+# -Dmetadata-keystore.metadata.algorithm=DESede
+# JAVA_OPTS: >-
# -Ddb.driver=org.postgresql.Driver
# -Ddb.username=postgres
# -Ddb.password=root
-# -Ddb.url=jdbc:postgresql://postgres-main/alfresco
-# -Dsolr.host=solr6
-# -Dsolr.port=8983
-# -Dsolr.secureComms=none
-# -Dsolr.base.url=/solr
-# -Dindex.subsystem.name=solr6
-# -Dalfresco.host=localhost
-# -Dalfresco.port=8080
-# -Dalfresco.context=alfresco
-# -Dalfresco.protocol=http"
-# ports:
-# - "8080:8080"
+# -Ddb.url=jdbc:postgresql://postgres-main:5432/alfresco
+# -Dshare.host=localhost
+# -Dshare.port=8085
+## -Dcsrf.filter.enabled=false
+## -Ddeployment.method=DOCKER_COMPOSE
+#
# depends_on:
# - postgres-main
-# - solr6
+# ports:
+# - "8080:8080"
# networks:
-# - spring
+# - alfresco-network
# - postgres-main
-# volumes:
-# - ./keystore:/opt/alfresco-search-services/solrhome/alfresco/keystore
-# - ./config/alfresco-global.properties:/usr/local/tomcat/shared/classes/alfresco-global.properties
-# - ./config/solrcore.properties:/usr/local/tomcat/shared/classes/solrcore.properties
-# solr6:
-# container_name: solr6
-# image: alfresco/alfresco-search-services:2.0.11
+#
+## postgres:
+## image: postgres:14.4
+## mem_limit: 512m
+## environment:
+## - POSTGRES_PASSWORD=alfresco
+## - POSTGRES_USER=alfresco
+## - POSTGRES_DB=alfresco
+## ports:
+## - "5433:5432"
+## networks:
+## - alfresco-network
+## volumes:
+## - alfresco_data:/var/lib/postgresql/data
+#
+# share:
+# image: docker.io/alfresco/alfresco-share:23.2.2
+# mem_limit: 1g
# environment:
-# SOLR_ALFRESCO_HOST: "alfresco"
-# SOLR_ALFRESCO_PORT: "8080"
-# SOLR_SOLR_HOST: "solr6"
-# SOLR_SOLR_PORT: "8983"
-# SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
-# ports:
-# - "8983:8983"
+# REPO_HOST: "alfresco"
+# REPO_PORT: "8080"
+# JAVA_OPTS: >-
+# -Dalfresco.host=localhost
+# -Dalfresco.port=8080
+# -Dalfresco.context=alfresco
+# -Dalfresco.protocol=http
# networks:
-# - spring
-# - postgres-main
+# - alfresco-network
+# ports:
+# - "8085:8080"
networks:
postgres-main:
driver: bridge
spring:
driver: bridge
+ nextcloud-network:
+ driver: bridge
volumes:
postgres:
pgadmin:
-# alfresco-data:
-# driver: local
-# solr-data:
-# driver: local
+ nextcloud_data:
+# alfresco_data:
+
+
##commands
# mvn clean package -P build-docker-image
diff --git a/init-db.sh b/init-db.sh
new file mode 100644
index 0000000..82b9762
--- /dev/null
+++ b/init-db.sh
@@ -0,0 +1,6 @@
+# init-db.sh
+
+set -e
+psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
+ CREATE DATABASE alfresco;
+EOSQL
\ No newline at end of file
From 4f29fb72a650f43f5d07d4952655c0b79c3d580d Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Wed, 14 Aug 2024 20:21:53 +0530
Subject: [PATCH 07/11] fix errors
---
docker-compose.yml | 16 ++++++++++++++--
set_trusted_domains.sh | 8 ++++++++
2 files changed, 22 insertions(+), 2 deletions(-)
create mode 100644 set_trusted_domains.sh
diff --git a/docker-compose.yml b/docker-compose.yml
index 4784b6f..d41ad97 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -115,7 +115,9 @@ services:
- SPRING_PROFILES_ACTIVE=docker
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka
- EUREKA_INSTANCE_HOSTNAME=dms-mediator
- - NEXTCLOUD_BASE_URL=http://nextcloud:8080
+ - NEXTCLOUD_BASE_URL=http://nextcloud:80
+ - NEXTCLOUD_USERNAME=admin
+ - NEXTCLOUD_PASSWORD=admin
depends_on:
- eureka-server
- nextcloud
@@ -132,16 +134,18 @@ services:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
+# - ./set_trusted_domains.sh:/usr/local/bin/set_trusted_domains.sh
environment:
- POSTGRES_DB=alfresco
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=root
- POSTGRES_HOST=postgres-main
+ - POSTGRES_PORT=5432
depends_on:
- postgres-main
networks:
- - spring
- nextcloud-network
+# entrypoint: ["/bin/sh", "-c", "/usr/local/bin/set_trusted_domains.sh && /entrypoint.sh apache2-foreground"]
# alfresco:
# image: docker.io/alfresco/alfresco-content-repository-community:23.2.1
@@ -223,3 +227,11 @@ volumes:
##commands
# mvn clean package -P build-docker-image
# docker-compose up -d
+
+# docker exec -it nextcloud /bin/bash
+# nano /var/www/html/config/config.php
+# 'trusted_domains' =>
+# array (
+# 0 => 'localhost',
+# 1 => 'nextcloud',
+# ),
diff --git a/set_trusted_domains.sh b/set_trusted_domains.sh
new file mode 100644
index 0000000..ac12b3a
--- /dev/null
+++ b/set_trusted_domains.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+CONFIG_PATH=/var/www/html/config/config.php
+if ! grep -q "'trusted_domains' =>" $CONFIG_PATH; then
+ echo "Setting trusted domain in config.php"
+ sed -i "s/0 => 'localhost'/0 => 'localhost', 1 => 'nextcloud'/" $CONFIG_PATH
+else
+ echo "Trusted domain already set"
+fi
\ No newline at end of file
From 86668b3a235df2448ce3423904e9c8aa870cccdc Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Sun, 25 Aug 2024 20:07:40 +0530
Subject: [PATCH 08/11] cors error fix
---
.../itgura/authservice/controller/AuthenticationController.java | 1 +
.../com/itgura/authservice/controller/StudentController.java | 2 ++
.../com/itgura/authservice/controller/TeacherController.java | 2 ++
.../com/itgura/paymentservice/controller/PaymentController.java | 1 +
.../itgura/paymentservice/controller/PermissionController.java | 1 +
5 files changed, 7 insertions(+)
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
index 11f53aa..69be616 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
@@ -12,6 +12,7 @@
import org.springframework.web.bind.annotation.*;
@RestController
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping("/api/v1/auth-service")
@RequiredArgsConstructor
public class AuthenticationController {
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/StudentController.java b/auth-service/src/main/java/com/itgura/authservice/controller/StudentController.java
index f71ef2f..80286eb 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/StudentController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/StudentController.java
@@ -1,10 +1,12 @@
package com.itgura.authservice.controller;
import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping("api/v1/student")
@RequiredArgsConstructor
public class StudentController {
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/TeacherController.java b/auth-service/src/main/java/com/itgura/authservice/controller/TeacherController.java
index 699a568..a3c1798 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/TeacherController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/TeacherController.java
@@ -1,10 +1,12 @@
package com.itgura.authservice.controller;
import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping("api/v1/teacher")
@RequiredArgsConstructor
public class TeacherController {
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
index fcdf64b..127766b 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
@@ -23,6 +23,7 @@
import java.util.UUID;
@RestController
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping("/api/v1/payment-service")
@RequiredArgsConstructor
public class PaymentController {
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/controller/PermissionController.java b/payment-service/src/main/java/com/itgura/paymentservice/controller/PermissionController.java
index f9f79f5..d58fe51 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/controller/PermissionController.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/controller/PermissionController.java
@@ -16,6 +16,7 @@
import java.util.List;
@RestController
+@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping(URIPrefix.API + URIPrefix.V1 + URIPathVariable.PAYMENT_SERVICE)
@RequiredArgsConstructor
public class PermissionController {
From 0008bdd6c68d12d8f4cad8a61672e8e36e0ce342 Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Sun, 29 Sep 2024 14:41:38 +0530
Subject: [PATCH 09/11] Added OAuth Authentication & Video Permission Grant
---
auth-service/pom.xml | 4 +
.../config/CustomOAuth2FailureHandler.java | 29 +++
.../config/CustomOAuth2SuccessHandler.java | 59 ++++++
.../config/SecurityConfiguration.java | 36 +++-
.../controller/AuthenticationController.java | 53 +++---
.../com/itgura/authservice/entity/User.java | 10 +-
.../services/AuthenticationService.java | 95 +++++++---
.../services/CustomOAuth2UserService.java | 30 +++
.../src/main/resources/application.properties | 14 +-
.../eurekaserver/EurekaServerApplication.java | 3 +
lib-common/pom.xml | 5 +
.../com/itgura/config/RabbitMQConfig.java | 46 +++++
.../itgura/util/rabbitMQMessageProducer.java | 21 +++
.../java/com/itgura/util/URIPathVariable.java | 2 +
.../main/java/com/itgura/util/URIPrefix.java | 2 +
lms-gateway/pom.xml | 7 +
.../itgura/lmsgateway/config/AppConfig.java | 7 +-
.../filter/OAuth2PathRewriteFilter.java | 40 ++++
.../lmsgateway/filter/RouteValidator.java | 4 +-
.../src/main/resources/application.properties | 24 ++-
.../controller/PaymentController.java | 2 +
.../controller/PermissionController.java | 11 +-
.../StudentTransactionContentRepository.java | 3 +
.../service/PermissionService.java | 2 +
.../service/impl/PaymentServiceImpl.java | 31 +++-
.../service/impl/PermissionServiceImpl.java | 60 +++++-
pom.xml | 1 +
.../main/java/com/itgura/ResourceMain.java | 29 +++
.../itgura/controller/SessionController.java | 11 ++
.../itgura/controller/sampleController.java | 14 ++
.../itgura/repository/MaterialRepository.java | 6 +
.../request/dto/PermissionGrantDto.java | 16 ++
.../request/dto/PermissionRevokeDto.java | 17 ++
.../main/resources/application-dev.properties | 7 +-
.../resources/application-prod.properties | 6 +
.../com/itgura/service/SessionService.java | 1 +
.../service/impl/MaterialServiceImpl.java | 75 ++++++++
.../service/impl/SessionServiceImpl.java | 35 ++++
test.html | 40 ++++
youtube-permission-manager.iml | 8 +
youtube-permission-manager/pom.xml | 76 ++++++++
.../youtube-permission-manager-all/pom.xml | 58 ++++++
.../itgura/YoutubePermissionManagerMain.java | 35 ++++
.../YoutubePermissionController.java | 22 +++
.../resources/application-docker.properties | 26 +++
.../resources/application-kube.properties | 16 ++
.../src/main/resources/application.properties | 6 +
.../youtube-permission-manager-dao/pom.xml | 63 +++++++
.../com/itgura/config/permissionConfig.java | 15 ++
.../request/dto/PermissionGrantDto.java | 16 ++
.../request/dto/PermissionRevokeDto.java | 17 ++
.../util/DummyEntityManagerFactory.java | 91 ++++++++++
.../main/resources/application-dev.properties | 12 ++
.../resources/application-prod.properties | 11 ++
.../main/resources/application-stg.properties | 28 +++
.../pom.xml | 53 ++++++
.../service/YoutubePermissionConsumer.java | 9 +
.../service/YoutubePermissionService.java | 12 ++
.../youtubePermissionManagerConfig.java | 72 ++++++++
.../impl/YoutubePermissionConsumerImpl.java | 34 ++++
.../impl/YoutubePermissionServiceImpl.java | 171 ++++++++++++++++++
61 files changed, 1641 insertions(+), 68 deletions(-)
create mode 100644 auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
create mode 100644 auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
create mode 100644 auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
create mode 100644 lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
create mode 100644 lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
create mode 100644 lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
create mode 100644 resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
create mode 100644 resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
create mode 100644 test.html
create mode 100644 youtube-permission-manager.iml
create mode 100644 youtube-permission-manager/pom.xml
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/pom.xml
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/YoutubePermissionManagerMain.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/controller/YoutubePermissionController.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-docker.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-kube.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/pom.xml
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/config/permissionConfig.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/util/DummyEntityManagerFactory.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-dev.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-prod.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-stg.properties
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/pom.xml
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionConsumer.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionService.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/config/youtubePermissionManagerConfig.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionConsumerImpl.java
create mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionServiceImpl.java
diff --git a/auth-service/pom.xml b/auth-service/pom.xml
index a043a7a..81cdf5d 100644
--- a/auth-service/pom.xml
+++ b/auth-service/pom.xml
@@ -26,6 +26,10 @@
org.springframework.boot
spring-boot-starter-security
+
+ org.springframework.boot
+ spring-boot-starter-oauth2-client
+
org.springframework.boot
spring-boot-starter-web
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
new file mode 100644
index 0000000..1662b25
--- /dev/null
+++ b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
@@ -0,0 +1,29 @@
+package com.itgura.authservice.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.itgura.dto.AppResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+@Component
+public class CustomOAuth2FailureHandler implements AuthenticationFailureHandler {
+
+
+ @Override
+ public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.AuthenticationException exception) throws IOException, ServletException {
+ response.setStatus(HttpStatus.UNAUTHORIZED.value());
+ response.setContentType("application/json");
+ response.getWriter().write(
+ new ObjectMapper().writeValueAsString(
+ AppResponse.error(null, "Unauthorized", "401", "", exception.getMessage())
+ )
+ );
+ response.getWriter().flush();
+ }
+}
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
new file mode 100644
index 0000000..e65c745
--- /dev/null
+++ b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
@@ -0,0 +1,59 @@
+package com.itgura.authservice.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.itgura.authservice.dto.response.AuthenticationResponse;
+import com.itgura.authservice.services.AuthenticationService;
+import com.itgura.authservice.services.JwtService;
+import com.itgura.dto.AppResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.core.user.OAuth2User;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+
+
+@Component
+public class CustomOAuth2SuccessHandler implements AuthenticationSuccessHandler {
+
+// @Value("${app.dashboard.url}")
+// private String DashboardUrl;
+
+
+ private final AuthenticationService authenticationService;
+
+ public CustomOAuth2SuccessHandler( AuthenticationService authenticationService) {
+ this.authenticationService = authenticationService;
+ }
+
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+ // Get the authenticated user's details from OAuth2
+ OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal();
+
+
+ // Process user login/registration in your AuthenticationService
+ AuthenticationResponse authResponse = authenticationService.processOAuthPostLogin(oAuth2User);
+
+// //Crate AppResponse
+ AppResponse appResponse = AppResponse.ok(authResponse);
+ // Send the AppResponse in the response body as JSON
+ response.setContentType("application/json");
+ response.getWriter().write(
+ new ObjectMapper().writeValueAsString(appResponse) // Serialize to JSON using ObjectMapper
+ );
+ response.getWriter().flush();
+// String dashboardUrl = DashboardUrl; // Or your actual dashboard URL
+//
+//// Perform the redirect
+// response.sendRedirect(dashboardUrl);
+ }
+}
\ No newline at end of file
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java b/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
index dbd3e97..8d5387c 100644
--- a/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
+++ b/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
@@ -2,10 +2,11 @@
import com.itgura.authservice.entity.Role;
+import com.itgura.authservice.services.CustomOAuth2UserService;
import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
@@ -17,14 +18,26 @@
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {
- private final JwtAuthenticationFilter jwtAuthFilter;
- private final AuthenticationProvider authenticationProvider;
+ @Autowired
+ private JwtAuthenticationFilter jwtAuthFilter;
+
+ @Autowired
+ private CustomOAuth2SuccessHandler customOAuth2SuccessHandler;
+ @Autowired
+ private CustomOAuth2FailureHandler customOAuth2FailureHandler;
+ @Autowired
+ private CustomOAuth2UserService CustomOAuth2UserService;
+
+
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+
+
+
http.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(request->request.requestMatchers(
"/api/v1/auth-service/**", // Your specific API access,
@@ -40,10 +53,25 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.anyRequest().authenticated())
.sessionManagement(manager->manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
- .authenticationProvider(authenticationProvider)
+// .authenticationProvider(authenticationProvider)
+
+ // Enabling OAuth2 login and defining success handler
+ .oauth2Login(oauth2 -> oauth2
+// .loginPage("/login") // Custom login page if any
+// .defaultSuccessUrl("https://github.com") // URL after successful login
+ .successHandler(customOAuth2SuccessHandler) // Custom success handler
+ .failureHandler(customOAuth2FailureHandler) // Custom failure handler
+ .userInfoEndpoint(userInfo -> userInfo
+ .userService(CustomOAuth2UserService))) // Custom OAuth2 user service
+
+
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class) ;
return http.build();
}
+
+
+
+
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
index 69be616..5631d5d 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
@@ -9,6 +9,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
+import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.*;
@RestController
@@ -19,28 +20,38 @@ public class AuthenticationController {
@Autowired
private final AuthenticationService authenticationService;
- @PostMapping("/register")
- public AppResponse register(@RequestBody RegisterRequest registerRequest){
- try {
- AuthenticationResponse res = authenticationService.register(registerRequest);
- return AppResponse.ok(res);
- } catch (Exception e) {
- return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
- }
-
- }
+// @PostMapping("/register")
+// public AppResponse register(@RequestBody RegisterRequest registerRequest){
+// try {
+// AuthenticationResponse res = authenticationService.register(registerRequest);
+// return AppResponse.ok(res);
+// } catch (Exception e) {
+// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
+// }
+//
+// }
+//
+// @PostMapping("/authenticate")
+// public AppResponse register(@RequestBody AuthenticationRequest authenticationRequest){
+// try {
+// AuthenticationResponse res = authenticationService.authenticate(authenticationRequest);
+// return AppResponse.ok(res);
+// } catch (Exception e) {
+// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
+//
+// }
+//
+// }
- @PostMapping("/authenticate")
- public AppResponse register(@RequestBody AuthenticationRequest authenticationRequest){
- try {
- AuthenticationResponse res = authenticationService.authenticate(authenticationRequest);
- return AppResponse.ok(res);
- } catch (Exception e) {
- return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
-
- }
-
- }
+// @PostMapping("/getAccessToken")
+// public AppResponse getAccessToken(OAuth2AuthenticationToken auth){
+// try {
+// AuthenticationResponse res = authenticationService.getAccessToken(auth);
+// return AppResponse.ok(res);
+// } catch (Exception e) {
+// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
+// }
+// }
@PostMapping("/refresh")
public AppResponse refresh(@RequestParam("token") String refreshToken){
diff --git a/auth-service/src/main/java/com/itgura/authservice/entity/User.java b/auth-service/src/main/java/com/itgura/authservice/entity/User.java
index 2544ae1..39ff9de 100644
--- a/auth-service/src/main/java/com/itgura/authservice/entity/User.java
+++ b/auth-service/src/main/java/com/itgura/authservice/entity/User.java
@@ -27,7 +27,6 @@ public class User implements UserDetails {
private String firstName;
private String lastName;
private String email;
- private String password;
@Enumerated(EnumType.STRING)
private Role role;
@@ -36,6 +35,11 @@ public Collection extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority(role.name()));
}
+ @Override
+ public String getPassword() {
+ return "";
+ }
+
@Override
public String getUsername() {
return this.email;
@@ -61,8 +65,4 @@ public boolean isEnabled() {
return true;
}
- @Override
- public String getPassword() {
- return this.password;
- }
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java b/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
index d58aa6c..ced8a45 100644
--- a/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
+++ b/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
@@ -6,10 +6,13 @@
import com.itgura.authservice.entity.Role;
import com.itgura.authservice.entity.User;
import com.itgura.authservice.repository.UserRepository;
+import jakarta.ws.rs.NotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
+import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@@ -18,39 +21,67 @@
@RequiredArgsConstructor
public class AuthenticationService {
private final UserRepository userRepository;
- private final PasswordEncoder passwordEncoder;
+// private final PasswordEncoder passwordEncoder;
private final JwtService jwtService;
- private final AuthenticationManager authenticationManager;
- public AuthenticationResponse register(RegisterRequest registerRequest) {
- var user = User.builder()
- .firstName(registerRequest.getFirstName())
- .lastName(registerRequest.getLastName())
- .email(registerRequest.getEmail())
- .password(passwordEncoder.encode(registerRequest.getPassword()))
- .role(Role.STUDENT)
- .build();
- userRepository.save(user);
- var jwtToken = jwtService.generateToken(user);
- var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
- return AuthenticationResponse.builder()
- .authenticationToken(jwtToken)
- .refreshToken(refreshToken)
- .build();
- }
+// private final AuthenticationManager authenticationManager;
- public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest) {
- authenticationManager.authenticate(
- new UsernamePasswordAuthenticationToken(authenticationRequest.getEmail(), authenticationRequest.getPassword())
- );
- var user = userRepository.findByEmail(authenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Invalid email or password"));
+// public AuthenticationResponse register(RegisterRequest registerRequest) {
+// var user = User.builder()
+// .firstName(registerRequest.getFirstName())
+// .lastName(registerRequest.getLastName())
+// .email(registerRequest.getEmail())
+// .password(passwordEncoder.encode(registerRequest.getPassword()))
+// .role(Role.STUDENT)
+// .build();
+// userRepository.save(user);
+// var jwtToken = jwtService.generateToken(user);
+// var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
+// return AuthenticationResponse.builder()
+// .authenticationToken(jwtToken)
+// .refreshToken(refreshToken)
+// .build();
+// }
+//
+// public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest) {
+// authenticationManager.authenticate(
+// new UsernamePasswordAuthenticationToken(authenticationRequest.getEmail(), authenticationRequest.getPassword())
+// );
+// var user = userRepository.findByEmail(authenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Invalid email or password"));
+// var jwtToken = jwtService.generateToken(user);
+// var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
+// return AuthenticationResponse.builder()
+// .authenticationToken(jwtToken)
+// .refreshToken(refreshToken)
+// .build();
+// }
+
+ // This method is invoked after a successful Google OAuth2 login
+ public AuthenticationResponse processOAuthPostLogin(OAuth2User oAuth2User) {
+ String email = oAuth2User.getAttribute("email");
+
+ // Check if the user already exists in your database
+ var user = userRepository.findByEmail(email).orElseGet(() -> {
+ // Register the user if they don't exist
+ User newUser = User.builder()
+ .firstName(oAuth2User.getAttribute("given_name")) // Extract first name from OAuth2 user info
+ .lastName(oAuth2User.getAttribute("family_name")) // Extract last name
+ .email(email)
+ .role(Role.STUDENT) // Assign default role (can be dynamic)
+ .build();
+ return userRepository.save(newUser);
+ });
+
+ // Generate JWT and refresh token
var jwtToken = jwtService.generateToken(user);
- var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
+ var refreshToken = jwtService.generateRefresh(new HashMap<>(), user);
+
return AuthenticationResponse.builder()
.authenticationToken(jwtToken)
.refreshToken(refreshToken)
.build();
}
+
public AuthenticationResponse refreshToken(String refreshToken) {
var user = userRepository.findByEmail(jwtService.getEmailFromToken(refreshToken)).orElseThrow(() -> new IllegalArgumentException("Invalid refresh token"));
@@ -65,4 +96,20 @@ public AuthenticationResponse refreshToken(String refreshToken) {
public Boolean validateToken(String token) {
return jwtService.validateToken(token);
}
+
+// public AuthenticationResponse getAccessToken(OAuth2AuthenticationToken auth) {
+// OAuth2User oAuth2User = auth.getPrincipal();
+// String email = oAuth2User.getAttribute("email");
+//
+// User user = userRepository.findByEmail(email).orElseThrow(() -> new NotFoundException("User not found"));
+//
+// // Generate JWT and refresh token
+// String jwtToken = jwtService.generateToken(user);
+// String refreshToken = jwtService.generateRefresh(new HashMap<>(), user);
+//
+// return AuthenticationResponse.builder()
+// .authenticationToken(jwtToken)
+// .refreshToken(refreshToken)
+// .build();
+// }
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java b/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
new file mode 100644
index 0000000..40ac641
--- /dev/null
+++ b/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
@@ -0,0 +1,30 @@
+package com.itgura.authservice.services;
+
+
+import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
+import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
+import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
+import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
+import org.springframework.security.oauth2.core.user.OAuth2User;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CustomOAuth2UserService implements OAuth2UserService {
+
+ private final AuthenticationService authenticationService;
+
+ public CustomOAuth2UserService(AuthenticationService authenticationService) {
+ this.authenticationService = authenticationService;
+ }
+
+ @Override
+ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
+ DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();
+ OAuth2User oAuth2User = delegate.loadUser(userRequest);
+
+ // After successful OAuth2 login, pass the OAuth2User to AuthenticationService to process login
+ authenticationService.processOAuthPostLogin(oAuth2User);
+
+ return oAuth2User;
+ }
+}
\ No newline at end of file
diff --git a/auth-service/src/main/resources/application.properties b/auth-service/src/main/resources/application.properties
index f02958b..a9138f6 100644
--- a/auth-service/src/main/resources/application.properties
+++ b/auth-service/src/main/resources/application.properties
@@ -21,7 +21,19 @@ spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
+logging.level.org.springframework.security=DEBUG
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
-jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
+app.dashboard.url=http://localhost:8081/Frontend/dashboard
+
+#oauth2
+spring.security.oauth2.client.registration.google.client-id=your_app_client_id
+spring.security.oauth2.client.registration.google.client-secret=your_app_client_secret
+spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8081/auth-service/login/oauth2/code/google
+spring.security.oauth2.client.registration.google.scope=profile,email
+spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth
+spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
+spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
+spring.security.oauth2.client.provider.google.user-name-attribute=email
\ No newline at end of file
diff --git a/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java b/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
index b9ad44a..9db1393 100644
--- a/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
+++ b/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
@@ -8,8 +8,11 @@
@EnableEurekaServer
public class EurekaServerApplication {
+
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
+
}
+
}
diff --git a/lib-common/pom.xml b/lib-common/pom.xml
index e1c9468..0b750a8 100644
--- a/lib-common/pom.xml
+++ b/lib-common/pom.xml
@@ -96,6 +96,11 @@
0.12.5
compile
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
\ No newline at end of file
diff --git a/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java b/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
new file mode 100644
index 0000000..c9ca7ab
--- /dev/null
+++ b/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
@@ -0,0 +1,46 @@
+package com.itgura.config;
+
+
+import lombok.AllArgsConstructor;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+@Configuration
+@AllArgsConstructor
+public class RabbitMQConfig {
+ private final ConnectionFactory connectionFactory;
+
+ //This allows us to send messages to RabbitMQ
+ @Bean
+ @Primary
+ public AmqpTemplate ampqTemplate() {
+ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
+ rabbitTemplate.setMessageConverter(jackSonMessageConverter());
+ return rabbitTemplate;
+ }
+
+ //This allows us to receive messages from RabbitMQ
+ @Bean
+ public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(){
+ SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory);
+ factory.setMessageConverter(jackSonMessageConverter());
+ return factory;
+
+ }
+
+
+ @Bean
+ public MessageConverter jackSonMessageConverter() {
+ MessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
+ return jackson2JsonMessageConverter;
+ }
+}
+
diff --git a/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java b/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
new file mode 100644
index 0000000..0a748f5
--- /dev/null
+++ b/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
@@ -0,0 +1,21 @@
+package com.itgura.util;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+@AllArgsConstructor
+public class rabbitMQMessageProducer {
+ @Qualifier("ampqTemplate")
+ private final AmqpTemplate amqpTemplate;
+
+ public void publish(Object payload, String exchange, String routingKey) {
+ log.info("Publishing message to RabbitMQ exchange: {} with routing key: {}. Payload :{}", exchange, routingKey, payload);
+ amqpTemplate.convertAndSend(exchange, routingKey, payload);
+ log.info("Published message to RabbitMQ exchange: {} with routing key: {}. Payload :{}", exchange, routingKey, payload);
+ }
+}
\ No newline at end of file
diff --git a/lib-global/src/main/java/com/itgura/util/URIPathVariable.java b/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
index 0c1ba66..e34274e 100644
--- a/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
+++ b/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
@@ -16,4 +16,6 @@ public class URIPathVariable {
public static final String PAYMENT_SERVICE = "/payment-service";
public static final String CONTENT_ID = "/{contentId}";
+ public static final String SESSION_ID = "/{sessionId}";
+ public static final String YOUTUBE_PERMISSION_SERVICE = "/youtube-permission-service";
}
diff --git a/lib-global/src/main/java/com/itgura/util/URIPrefix.java b/lib-global/src/main/java/com/itgura/util/URIPrefix.java
index dd0d7ba..e4bb7a7 100644
--- a/lib-global/src/main/java/com/itgura/util/URIPrefix.java
+++ b/lib-global/src/main/java/com/itgura/util/URIPrefix.java
@@ -27,4 +27,6 @@ public class URIPrefix {
public static final String GET_ACCESS_TIME_DURATION = "/get-access-time-duration";
public static final String GET_PRICE = "/get-price";
public static final String UPDATE_TAGS = "/update-tags";
+ public static final String GIVE_PERMISSION_TO_VIDEOS = "/give-permission-to-videos";
+ public static final String EMAIL = "/{email}";
}
diff --git a/lms-gateway/pom.xml b/lms-gateway/pom.xml
index cfcf514..d943039 100644
--- a/lms-gateway/pom.xml
+++ b/lms-gateway/pom.xml
@@ -59,6 +59,13 @@
springdoc-openapi-starter-webflux-ui
2.5.0
+
+ jakarta.servlet
+ jakarta.servlet-api
+ 6.1.0
+ provided
+
+
org.springdoc
springdoc-openapi-starter-webflux-api
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
index cfd5933..db9b411 100644
--- a/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
+++ b/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
@@ -4,13 +4,18 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
+import org.springframework.web.filter.ForwardedHeaderFilter;
@Configuration
public class AppConfig {
@Bean
-
public RestTemplate template() {
return new RestTemplate();
}
+
+ @Bean
+ public ForwardedHeaderFilter forwardedHeaderFilter() {
+ return new ForwardedHeaderFilter();
+ }
}
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
new file mode 100644
index 0000000..3311335
--- /dev/null
+++ b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
@@ -0,0 +1,40 @@
+package com.itgura.lmsgateway.filter;
+
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+
+@Component
+public class OAuth2PathRewriteFilter extends AbstractGatewayFilterFactory {
+
+ public static class Config {
+ // Put any needed configuration properties here
+ }
+
+ public OAuth2PathRewriteFilter() {
+ super(Config.class);
+ }
+
+ @Override
+ public GatewayFilter apply(Config config) {
+ return (exchange, chain) -> {
+ ServerWebExchange modifiedExchange = exchange;
+
+ // Get the original request path
+ String path = exchange.getRequest().getURI().getPath();
+
+ // Check if the request is for OAuth2 callback or authorization paths
+ if (path.contains("/login/oauth2/code/google") || path.contains("/oauth2/authorization/google")) {
+ // Rewrite the path by removing '/api/v1/auth-service'
+ String newPath = path.replace("/api/v1/auth-service", "");
+
+ // Mutate the request with the new path
+ modifiedExchange = exchange.mutate().request(exchange.getRequest().mutate().path(newPath).build()).build();
+ }
+
+ // Proceed with the filter chain
+ return chain.filter(modifiedExchange);
+ };
+ }
+}
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
index 44c3907..9977028 100644
--- a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
+++ b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
@@ -17,7 +17,9 @@ public class RouteValidator {
"/auth-service/refresh",
"/auth-service/validateToken",
"/eureka",
- "/resource-management/public"
+ "/resource-management/public",
+ "/auth-service/login/oauth2/code/google",
+ "auth-service/oauth2/authorization/google"
diff --git a/lms-gateway/src/main/resources/application.properties b/lms-gateway/src/main/resources/application.properties
index 128e199..082bc01 100644
--- a/lms-gateway/src/main/resources/application.properties
+++ b/lms-gateway/src/main/resources/application.properties
@@ -20,6 +20,8 @@ server.servlet.context-path=/
jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+logging.level.org.springframework.cloud.gateway=DEBUG
+
# eureka
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
@@ -52,6 +54,7 @@ spring.cloud.gateway.routes[1].filters[1].args.replacement=/api/v1/dms-mediator/
spring.cloud.gateway.routes[1].filters[0].name=AuthenticationFilter
+
#auth-service
spring.cloud.gateway.routes[2].id=auth-service
spring.cloud.gateway.routes[2].uri=lb://auth-service
@@ -62,6 +65,7 @@ spring.cloud.gateway.routes[2].predicates[0].args.pattern=/auth-service/**
spring.cloud.gateway.routes[2].filters[0].name=RewritePath
spring.cloud.gateway.routes[2].filters[0].args.regexp=/auth-service/(?.*)
spring.cloud.gateway.routes[2].filters[0].args.replacement=/api/v1/auth-service/${remaining}
+spring.cloud.gateway.routes[2].filters[1].name=OAuth2PathRewriteFilter
#payment-service
spring.cloud.gateway.routes[3].id=payment-service
@@ -76,8 +80,24 @@ spring.cloud.gateway.routes[3].filters[1].args.replacement=/api/v1/payment-servi
spring.cloud.gateway.routes[3].filters[0].name=AuthenticationFilter
-
-
+#
+## OAuth2 callback route - remove '/api/v1/auth-service/' prefix
+#spring.cloud.gateway.routes[4].id=auth-service-oauth2-callback
+#spring.cloud.gateway.routes[4].uri=lb://auth-service
+#spring.cloud.gateway.routes[4].predicates[0].name=Path
+#spring.cloud.gateway.routes[4].predicates[0].args.pattern=/api/v1/auth-service/login/oauth2/code/google
+#spring.cloud.gateway.routes[4].filters[0].name=RewritePath
+#spring.cloud.gateway.routes[4].filters[0].args.regexp=/api/v1/auth-service/(?.*)
+#spring.cloud.gateway.routes[4].filters[0].args.replacement=/${remaining}
+#
+## OAuth2 authorization route - remove '/api/v1/auth-service/' prefix
+#spring.cloud.gateway.routes[5].id=auth-service-oauth2-auth
+#spring.cloud.gateway.routes[5].uri=lb://auth-service
+#spring.cloud.gateway.routes[5].predicates[0].name=Path
+#spring.cloud.gateway.routes[5].predicates[0].args.pattern=/api/v1/auth-service/oauth2/authorization/google
+#spring.cloud.gateway.routes[5].filters[0].name=RewritePath
+#spring.cloud.gateway.routes[5].filters[0].args.regexp=/api/v1/auth-service/(?.*)
+#spring.cloud.gateway.routes[5].filters[0].args.replacement=/${remaining}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
index 127766b..d3a2649 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
@@ -138,4 +138,6 @@ public AppResponse saveContentPayment(@Valid @RequestBody AppRequest> hasPermission(@Valid @RequestBody AppRequest request) {
@@ -39,4 +38,12 @@ public AppResponse> hasPermission(@Valid @RequestBod
}
+ @PostMapping("/permission/getEmailsHasAccessToSession"+URIPathVariable.SESSION_ID)
+ public AppResponse> getEmailsHasAccessToSession(@PathVariable String sessionId) {
+ try{
+ return AppResponse.ok(permissionService.getEmailsHasAccessToSession(sessionId));
+ } catch (Exception e) {
+ return null;
+ }
+ }
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java b/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
index 46ac35b..2f91691 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
@@ -26,4 +26,7 @@ public interface StudentTransactionContentRepository extends JpaRepository findByContentExpireDateBefore(Date currentDate);
+
+ @Query("SELECT stc FROM StudentTransactionContent stc WHERE stc.contentId = :uuid")
+ List findByContentId(UUID uuid);
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java b/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
index 4b46c0b..4b9a38b 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
@@ -9,4 +9,6 @@
public interface PermissionService {
List hasPermission(hasPermissionRequest data) throws ApplicationException;
+
+ List getEmailsHasAccessToSession(String sessionId);
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
index cfaea11..e891a70 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
@@ -63,13 +63,14 @@ public String saveMonthlyPayment(saveMonthlyPaymentRequest data) throws BadReque
if (data.getPaymentAmount() / months.length == classMonthlyPayment) {
transaction.setAmount(classMonthlyPayment);
Transaction transaction1= transactionRepository.save(transaction);
- //todo: cron job to update studentTransactionContent table
+ //todo: cron job to update studentTransactionContent table - (delete expired contents-done)
List sessionIds = findAllSessionsInMonth(data.getClassId(), Calendar.getInstance().get(Calendar.YEAR), month);
for (UUID sessionId : sessionIds) {
StudentTransactionContent studentTransactionContent = new StudentTransactionContent();
studentTransactionContent.setStudentEmail(data.getStudentEmail());
studentTransactionContent.setContentId(sessionId);
studentTransactionContent.setTransaction(transaction1);
+ giveVideosAccessInSession(sessionId,data.getStudentEmail());
}
@@ -83,6 +84,34 @@ public String saveMonthlyPayment(saveMonthlyPaymentRequest data) throws BadReque
}
+ private void giveVideosAccessInSession(UUID sessionId, String studentEmail) throws ApplicationException {
+ String url = "http://lms-gateway/resource-management/session/give-permission-to-videos/" + sessionId + "/" + studentEmail;
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Authorization", "Bearer " + UserUtil.extractToken());
+ HttpEntity entity = new HttpEntity<>(headers);
+
+ try {
+ ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, AppResponse.class);
+ AppResponse response = responseEntity.getBody();
+
+ if (response == null || response.getData() == null) {
+ throw new ApplicationException("Error while getting sessions in month: response or data is null");
+ }
+
+ System.out.println("Access Given "+studentEmail+" for following video ids(UUID) "+response.getData());
+
+
+
+ } catch (HttpClientErrorException.Forbidden e) {
+ throw new ApplicationException("Access is forbidden: " + e.getMessage());
+ } catch (HttpClientErrorException e) {
+ throw new ApplicationException("Client error: " + e.getStatusCode() + " " + e.getMessage());
+ } catch (Exception e) {
+ throw new ApplicationException("Server error: " + e.getMessage());
+ }
+
+ }
+
private List findAllSessionsInMonth(UUID classId, int year, int month) throws ApplicationException {
String url = "http://lms-gateway/resource-management/session/get-all/in-month-and-class/" + classId + "/" + year + "/" + month;
HttpHeaders headers = new HttpHeaders();
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
index 7abc635..c6d00fc 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
@@ -1,8 +1,10 @@
package com.itgura.paymentservice.service.impl;
+import com.itgura.dto.AppResponse;
import com.itgura.exception.ApplicationException;
import com.itgura.paymentservice.dto.request.hasPermissionRequest;
import com.itgura.paymentservice.dto.response.hasPermissionResponse;
+import com.itgura.paymentservice.entity.StudentTransactionContent;
import com.itgura.paymentservice.repository.StudentTransactionContentRepository;
import com.itgura.paymentservice.service.PermissionService;
import com.itgura.util.UserUtil;
@@ -10,16 +12,18 @@
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.UUID;
-import java.util.stream.Collectors;
-
-import static com.fasterxml.jackson.databind.type.LogicalType.Map;
@Service
public class PermissionServiceImpl implements PermissionService {
@@ -31,6 +35,9 @@ public class PermissionServiceImpl implements PermissionService {
@Autowired
private StudentTransactionContentRepository studentTransactionContentRepository;
+
+
+
@Override
public List hasPermission(hasPermissionRequest data) throws ApplicationException {
@@ -58,7 +65,8 @@ public List hasPermission(hasPermissionRequest data) thro
if (authorities.contains("ADMIN") || authorities.contains("TEACHER")) {
response.add(new hasPermissionResponse(contentId, true));
} else if (authorities.contains("STUDENT")) {
- response.add(new hasPermissionResponse(contentId, studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)));
+// response.add(new hasPermissionResponse(contentId, (studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)|| hasPermissionForRelevantSession(email,contentId))));
+ response.add(new hasPermissionResponse(contentId, (studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)))); // only checking has access to particular session - If it has access to session all the content can access in it
} else {
response.add(new hasPermissionResponse(contentId, false));
}
@@ -77,4 +85,46 @@ public List hasPermission(hasPermissionRequest data) thro
return null;
}
+
+ @Override
+ public List getEmailsHasAccessToSession(String sessionId) {
+ List emails = new ArrayList<>();
+ List studentTransactionContents = studentTransactionContentRepository.findByContentId(UUID.fromString(sessionId));
+ if(!studentTransactionContents.isEmpty()) {
+
+ for (StudentTransactionContent studentTransactionContent : studentTransactionContents) {
+ emails.add(studentTransactionContent.getStudentEmail());
+ }
+ }
+ return emails;
+ }
+
+
+// private boolean hasPermissionForRelevantSession(String email, UUID contentId) throws ApplicationException {
+// //get session id for relevant content id
+// String url = "http://lms-gateway/resource-management/resource-management/session/getSessionIdByContentId/"+contentId;
+// HttpHeaders headers = new HttpHeaders();
+// headers.add("Authorization", "Bearer " + UserUtil.extractToken());
+// HttpEntity entity = new HttpEntity<>(headers);
+//
+// try {
+// ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, AppResponse.class);
+// AppResponse response = responseEntity.getBody();
+//
+// if (response == null || response.getData() == null) {
+// throw new ApplicationException("Error while getting sessions in month: response or data is null");
+// }
+//
+// System.out.println("Sessions for Month "+response.getData());
+//
+// return (List) response.getData();
+//
+// } catch (HttpClientErrorException.Forbidden e) {
+// throw new ApplicationException("Access is forbidden: " + e.getMessage());
+// } catch (HttpClientErrorException e) {
+// throw new ApplicationException("Client error: " + e.getStatusCode() + " " + e.getMessage());
+// } catch (Exception e) {
+// throw new ApplicationException("Server error: " + e.getMessage());
+// }
+// }
}
diff --git a/pom.xml b/pom.xml
index 03c05c6..22b48d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,7 @@
auth-service
dms-mediator
payment-service
+ youtube-permission-manager
diff --git a/resource-management/resource-management-all/src/main/java/com/itgura/ResourceMain.java b/resource-management/resource-management-all/src/main/java/com/itgura/ResourceMain.java
index 2536f53..9bf9e20 100644
--- a/resource-management/resource-management-all/src/main/java/com/itgura/ResourceMain.java
+++ b/resource-management/resource-management-all/src/main/java/com/itgura/ResourceMain.java
@@ -1,15 +1,44 @@
package com.itgura;
+import com.itgura.request.dto.PermissionGrantDto;
+import com.itgura.request.dto.PermissionRevokeDto;
import com.itgura.util.BootMain;
+import com.itgura.util.rabbitMQMessageProducer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+
+import java.util.List;
@EnableDiscoveryClient
@SpringBootApplication
+
+
+
public class ResourceMain {
+
+
public static void main(String[] args) {
+
BootMain.main(args);
SpringApplication.run(ResourceMain.class);
}
+
+ @Bean
+ CommandLineRunner init(rabbitMQMessageProducer producer) {
+
+ PermissionGrantDto permissionGrantDto = new PermissionGrantDto();
+ permissionGrantDto.setVideoUrl("https://www.youtube.com/watch?v=123456");
+ permissionGrantDto.setEmails(List.of("email1", "email2"));
+ return args -> {
+ producer.publish(permissionGrantDto, "internal.exchange", "permission.grant.routing-key");
+ };
+
+ }
+
+
+
}
\ No newline at end of file
diff --git a/resource-management/resource-management-all/src/main/java/com/itgura/controller/SessionController.java b/resource-management/resource-management-all/src/main/java/com/itgura/controller/SessionController.java
index 16100ba..c4b812d 100644
--- a/resource-management/resource-management-all/src/main/java/com/itgura/controller/SessionController.java
+++ b/resource-management/resource-management-all/src/main/java/com/itgura/controller/SessionController.java
@@ -76,4 +76,15 @@ public AppResponse updateSession(@PathVariable UUID sessionId, @RequestB
}
}
+ @PostMapping(ResourceManagementURI.SESSION + URIPrefix.GIVE_PERMISSION_TO_VIDEOS+URIPrefix.SESSION_ID+URIPrefix.EMAIL)
+ public AppResponse> givePermissionToVideos(@PathVariable UUID sessionId, @PathVariable String email) {
+ try {
+ List ids = sessionService.givePermissionToVideos(sessionId,email);
+ return AppResponse.ok(ids);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return AppResponse.error(null, e.getMessage(), "Server Error", "500", "");
+ }
+ }
+
}
diff --git a/resource-management/resource-management-all/src/main/java/com/itgura/controller/sampleController.java b/resource-management/resource-management-all/src/main/java/com/itgura/controller/sampleController.java
index 8a5126d..2ece09b 100644
--- a/resource-management/resource-management-all/src/main/java/com/itgura/controller/sampleController.java
+++ b/resource-management/resource-management-all/src/main/java/com/itgura/controller/sampleController.java
@@ -1,15 +1,23 @@
package com.itgura.controller;
+import com.itgura.request.dto.PermissionRevokeDto;
+import com.itgura.util.rabbitMQMessageProducer;
import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+
@RestController
@RequestMapping("/api/v1/resource-management")
@RequiredArgsConstructor
public class sampleController {
+
+ @Autowired
+ private rabbitMQMessageProducer producer;
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@GetMapping("/sampleAdmin")
public String sampleAdmin(){
@@ -17,6 +25,12 @@ public String sampleAdmin(){
}
@GetMapping("/sampleUser")
public String sampleUser(){
+
+ PermissionRevokeDto permissionRevokeDto = new PermissionRevokeDto();
+ permissionRevokeDto.setVideoUrl("videoUrl");
+ permissionRevokeDto.setEmails(List.of(new String[]{"email1", "email2"}));
+ producer.publish(permissionRevokeDto,"internal.exchange","permission.revoke.routing-key");
+
return "Sample";
}
diff --git a/resource-management/resource-management-dao/src/main/java/com/itgura/repository/MaterialRepository.java b/resource-management/resource-management-dao/src/main/java/com/itgura/repository/MaterialRepository.java
index d6b7765..0748349 100644
--- a/resource-management/resource-management-dao/src/main/java/com/itgura/repository/MaterialRepository.java
+++ b/resource-management/resource-management-dao/src/main/java/com/itgura/repository/MaterialRepository.java
@@ -1,13 +1,19 @@
package com.itgura.repository;
import com.itgura.entity.Material;
+import com.itgura.entity.Session;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.stereotype.Repository;
+import java.util.List;
import java.util.UUID;
@Repository
@EnableJpaRepositories
public interface MaterialRepository extends JpaRepository {
+
+ @Query(value = "SELECT * FROM material WHERE session_id = :session.id AND ", nativeQuery = true)
+ List findAllVideoMaterialsBySession(Session session);
}
diff --git a/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java b/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
new file mode 100644
index 0000000..eff6e34
--- /dev/null
+++ b/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
@@ -0,0 +1,16 @@
+package com.itgura.request.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PermissionGrantDto {
+ private String videoUrl;
+ private List emails;
+}
diff --git a/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java b/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
new file mode 100644
index 0000000..92710ae
--- /dev/null
+++ b/resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
@@ -0,0 +1,17 @@
+package com.itgura.request.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PermissionRevokeDto {
+ private String videoUrl;
+ private List emails;
+}
diff --git a/resource-management/resource-management-dao/src/main/resources/application-dev.properties b/resource-management/resource-management-dao/src/main/resources/application-dev.properties
index 1b0b737..bbb043e 100644
--- a/resource-management/resource-management-dao/src/main/resources/application-dev.properties
+++ b/resource-management/resource-management-dao/src/main/resources/application-dev.properties
@@ -31,4 +31,9 @@ eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.instance.hostname=localhost
-jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
+
+spring.rabbitmq.host = localhost
+spring.rabbitmq.port = 5672
+spring.rabbitmq.username = guest
+spring.rabbitmq.password = guest
\ No newline at end of file
diff --git a/resource-management/resource-management-dao/src/main/resources/application-prod.properties b/resource-management/resource-management-dao/src/main/resources/application-prod.properties
index b0c5061..8b2e34a 100644
--- a/resource-management/resource-management-dao/src/main/resources/application-prod.properties
+++ b/resource-management/resource-management-dao/src/main/resources/application-prod.properties
@@ -23,3 +23,9 @@ spring.datasource.hikari.maximum-pool-size=10000
spring.datasource.hikari.minimum-idle= 10
spring.datasource.hikari.idle-timeout= 120000
spring.datasource.hikari.connectionTimeout= 5000
+
+
+spring.rabbitmq.host = localhost
+spring.rabbitmq.port = 5672
+spring.rabbitmq.username = guest
+spring.rabbitmq.password = guest
\ No newline at end of file
diff --git a/resource-management/resource-management-service/src/main/java/com/itgura/service/SessionService.java b/resource-management/resource-management-service/src/main/java/com/itgura/service/SessionService.java
index c5ca68c..2e97122 100644
--- a/resource-management/resource-management-service/src/main/java/com/itgura/service/SessionService.java
+++ b/resource-management/resource-management-service/src/main/java/com/itgura/service/SessionService.java
@@ -20,4 +20,5 @@ public interface SessionService {
String updateSession(UUID sessionId, SessionRequest request) throws ApplicationException, CredentialNotFoundException, BadRequestRuntimeException, URISyntaxException;
String deleteSession(UUID sessionId) throws ApplicationException, CredentialNotFoundException, BadRequestRuntimeException, URISyntaxException;
+ List givePermissionToVideos(UUID sessionId, String email) throws ValueNotExistException;
}
diff --git a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/MaterialServiceImpl.java b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/MaterialServiceImpl.java
index fd2ee60..9a12a47 100644
--- a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/MaterialServiceImpl.java
+++ b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/MaterialServiceImpl.java
@@ -1,5 +1,6 @@
package com.itgura.service.impl;
+import com.itgura.dto.AppResponse;
import com.itgura.entity.Material;
import com.itgura.entity.MaterialType;
import com.itgura.entity.Session;
@@ -10,6 +11,8 @@
import com.itgura.repository.MaterialTypeRepository;
import com.itgura.repository.SessionRepository;
import com.itgura.request.MaterialRequest;
+import com.itgura.request.dto.PermissionGrantDto;
+import com.itgura.request.dto.PermissionRevokeDto;
import com.itgura.request.dto.UserResponseDto;
import com.itgura.response.dto.MaterialResponseDto;
import com.itgura.response.dto.SessionResponseDto;
@@ -18,10 +21,17 @@
import com.itgura.service.MaterialService;
import com.itgura.service.UserDetailService;
import com.itgura.util.UserUtil;
+import com.itgura.util.rabbitMQMessageProducer;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.ForbiddenException;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
import javax.security.auth.login.CredentialNotFoundException;
import java.util.Date;
@@ -39,6 +49,10 @@ public class MaterialServiceImpl implements MaterialService {
private MaterialTypeRepository materialTypeRepository;
@Autowired
private MaterialRepository materialRepository;
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private rabbitMQMessageProducer producer;
@Override
@@ -54,6 +68,9 @@ public String addMaterial(UUID sessionId, MaterialRequest request) throws Applic
.orElseThrow(() -> new ValueNotExistException("Session not found with id " + sessionId));
MaterialType materialType = materialTypeRepository.findById(request.getMaterialType())
.orElseThrow(() -> new ValueNotExistException("Material Type not found with id " + request.getMaterialType()));
+
+
+
Material material = new Material();
material.setMaterialName(request.getMaterialName());
material.setDescription(request.getDescription());
@@ -65,6 +82,12 @@ public String addMaterial(UUID sessionId, MaterialRequest request) throws Applic
material.setCreatedOn(new Date(System.currentTimeMillis()));
materialRepository.save(material);
+ if(materialType.getMaterialType().equals("Video")){
+ //get email list to already has access to the session
+ List emails = getMailsHasAlreadyAccessToSession(sessionId);
+ givePermissionToYoutubeVideo(request.getReference(),emails);
+ }
+
return "Material added successfully";
} else {
throw new ForbiddenException("You are not allowed to add material");
@@ -77,6 +100,36 @@ public String addMaterial(UUID sessionId, MaterialRequest request) throws Applic
}
+
+
+ private List getMailsHasAlreadyAccessToSession(UUID sessionId) throws ApplicationException {
+ String url = "http://lms-gateway/payment-service/permission/getEmailsHasAccessToSession/"+sessionId;
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Authorization", "Bearer " + UserUtil.extractToken());
+ HttpEntity entity = new HttpEntity<>(headers);
+
+ try {
+ ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, AppResponse.class);
+ AppResponse response = responseEntity.getBody();
+
+ if (response == null || response.getData() == null) {
+ throw new ApplicationException("Error while getting sessions in month: response or data is null");
+ }
+
+ System.out.println("Mails Has Already Access - "+response.getData());
+
+ return (List) response.getData();
+
+ } catch (HttpClientErrorException.Forbidden e) {
+ throw new ApplicationException("Access is forbidden: " + e.getMessage());
+ } catch (HttpClientErrorException e) {
+ throw new ApplicationException("Client error: " + e.getStatusCode() + " " + e.getMessage());
+ } catch (Exception e) {
+ throw new ApplicationException("Server error: " + e.getMessage());
+ }
+
+ }
+
@Override
@Transactional
public String updateMaterial(UUID materialId, MaterialRequest request) throws ApplicationException, CredentialNotFoundException, BadRequestRuntimeException {
@@ -121,6 +174,14 @@ public String deleteMaterial(UUID materialId) throws ApplicationException, Crede
if (loggedUserDetails.getUserRoles().equals("ADMIN") || loggedUserDetails.getUserRoles().equals("TEACHER")) {
Material material = materialRepository.findById(materialId)
.orElseThrow(() -> new ValueNotExistException("Material not found with id " + materialId));
+
+ //Revoke permission to youtube video
+ if(material.getMaterialType().getMaterialType().equals("Video")){
+ //get email list to already has access to the session
+ List emails = getMailsHasAlreadyAccessToSession(material.getSession().getContentId());
+ //Revoke permission to youtube video
+ RevokePermissionToYoutubeVideo(material.getReference(),emails);
+ }
materialRepository.delete(material);
return "Material deleted successfully";
} else {
@@ -132,6 +193,20 @@ public String deleteMaterial(UUID materialId) throws ApplicationException, Crede
}
+ private void RevokePermissionToYoutubeVideo(String videoUrl, List emails) {
+ PermissionRevokeDto permissionRevokeDto = new PermissionRevokeDto();
+ permissionRevokeDto.setVideoUrl(videoUrl);
+ permissionRevokeDto.setEmails(emails);
+ producer.publish(permissionRevokeDto,"internal.exchange","permission.revoke.routing-key");
+ }
+
+ private void givePermissionToYoutubeVideo(String videoUrl, List mailList) {
+ PermissionGrantDto permissionGrantDto = new PermissionGrantDto();
+ permissionGrantDto.setVideoUrl(videoUrl);
+ permissionGrantDto.setEmails(mailList);
+ producer.publish(permissionGrantDto,"internal.exchange","permission.grant.routing-key");
+ }
+
// @Override
// public MaterialResponseDto findMaterialById(UUID materialId) throws ApplicationException, CredentialNotFoundException, BadRequestRuntimeException {
// UserResponseDto loggedUserDetails = userDetailService.getLoggedUserDetails(UserUtil.extractToken());
diff --git a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/SessionServiceImpl.java b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/SessionServiceImpl.java
index 838c683..32a7d96 100644
--- a/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/SessionServiceImpl.java
+++ b/resource-management/resource-management-service/src/main/java/com/itgura/service/impl/SessionServiceImpl.java
@@ -8,6 +8,7 @@
import com.itgura.exception.ValueNotExistException;
import com.itgura.repository.*;
import com.itgura.request.SessionRequest;
+import com.itgura.request.dto.PermissionGrantDto;
import com.itgura.request.dto.UserResponseDto;
import com.itgura.response.dto.MaterialResponseDto;
import com.itgura.response.dto.SessionResponseDto;
@@ -18,6 +19,7 @@
import com.itgura.service.SessionService;
import com.itgura.service.UserDetailService;
import com.itgura.util.UserUtil;
+import com.itgura.util.rabbitMQMessageProducer;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.ForbiddenException;
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,6 +50,10 @@ public class SessionServiceImpl implements SessionService {
private ScheduleSessionRepositoryRepository scheduleSessionRepositoryRepository;
@Autowired
private ContentPermissionService contentPermissionService;
+ @Autowired
+ private MaterialRepository materialRepository;
+ @Autowired
+ private rabbitMQMessageProducer producer;
@Override
@Transactional
@@ -316,6 +322,35 @@ public String deleteSession(UUID sessionId) throws ApplicationException, Credent
}
}
+ @Override
+ public List givePermissionToVideos(UUID sessionId, String email) throws ValueNotExistException {
+ Session session = sessionRepository.findById(sessionId).orElseThrow(() -> new ValueNotExistException("Session not found with id " + sessionId));
+ List materials = session.getMaterialList();
+ List VideoMaterials = new ArrayList<>();
+ for (Material m : materials) {
+ if (m.getMaterialType().equals("VIDEO")) {
+ List allVideoMaterialsBySession = materialRepository.findAllVideoMaterialsBySession(session);
+ VideoMaterials.addAll(allVideoMaterialsBySession);
+ List mailList = new ArrayList<>();
+ mailList.add(email);
+ givePermissionToYoutubeVideo(m.getReference(), mailList);
+ }
+ }
+
+
+ return VideoMaterials.stream()
+ .map(Material::getContentId)
+ .collect(Collectors.toList());
+
+ }
+
+ private void givePermissionToYoutubeVideo(String videoUrl, List mailList) {
+ PermissionGrantDto permissionGrantDto = new PermissionGrantDto();
+ permissionGrantDto.setVideoUrl(videoUrl);
+ permissionGrantDto.setEmails(mailList);
+ producer.publish(permissionGrantDto,"internal.exchange","permission.grant.routing-key");
+ }
+
private boolean addSessionToSchedule(UUID classId,Session session,Boolean isNew) throws ValueNotExistException {
AClass aClass = classRepository.findById(classId).orElseThrow(() -> new ValueNotExistException("Class not found with id " + classId));
Schedule byAClassContentId = scheduleRepository.findScheduleByAClass(aClass);
diff --git a/test.html b/test.html
new file mode 100644
index 0000000..b73ab23
--- /dev/null
+++ b/test.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+ Sign in with Google
+
+
+
+
+
Sign in with Google
+
+
+
+
diff --git a/youtube-permission-manager.iml b/youtube-permission-manager.iml
new file mode 100644
index 0000000..27754dd
--- /dev/null
+++ b/youtube-permission-manager.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/youtube-permission-manager/pom.xml b/youtube-permission-manager/pom.xml
new file mode 100644
index 0000000..ea1a553
--- /dev/null
+++ b/youtube-permission-manager/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+ com.itgura.lms
+ lms
+ 1.0.0
+
+
+ youtube-permission-manager
+ pom
+
+ youtube-permission-manager-all
+ youtube-permission-manager-dao
+ youtube-permission-manager-service
+
+ 1.0.0
+
+
+
+
+
+
+
+ 17
+ 2023.0.1
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.itgura.lms
+ lib-common
+ 0.0.1
+ compile
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/youtube-permission-manager/youtube-permission-manager-all/pom.xml b/youtube-permission-manager/youtube-permission-manager-all/pom.xml
new file mode 100644
index 0000000..4ce343b
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/pom.xml
@@ -0,0 +1,58 @@
+
+ 4.0.0
+
+ youtube-permission-manager
+ com.itgura.lms
+ 1.0.0
+
+ jar
+ youtube-permission-manager-all
+
+
+
+ build-docker-image
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ package
+
+ build
+
+
+
+
+
+
+
+
+
+
+
+ com.itgura.lms
+ youtube-permission-manager-service
+ 1.0.0
+ compile
+
+
+
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/YoutubePermissionManagerMain.java b/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/YoutubePermissionManagerMain.java
new file mode 100644
index 0000000..2fa7211
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/YoutubePermissionManagerMain.java
@@ -0,0 +1,35 @@
+package com.itgura;
+
+
+
+import com.itgura.service.YoutubePermissionService;
+import com.itgura.util.BootMain;
+import com.itgura.util.rabbitMQMessageProducer;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+
+import java.util.List;
+
+
+@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
+@EnableDiscoveryClient
+public class YoutubePermissionManagerMain {
+
+
+
+ public static void main(String[] args) {
+ BootMain.main(args);
+ SpringApplication.run(YoutubePermissionManagerMain.class, args);
+ }
+
+
+
+
+
+
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/controller/YoutubePermissionController.java b/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/controller/YoutubePermissionController.java
new file mode 100644
index 0000000..bcc0d55
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/controller/YoutubePermissionController.java
@@ -0,0 +1,22 @@
+package com.itgura.controller;
+
+
+import com.itgura.service.YoutubePermissionService;
+import com.itgura.util.URIPathVariable;
+import com.itgura.util.URIPrefix;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+@CrossOrigin(origins = "*", allowedHeaders = "*")
+@RestController
+@RequestMapping(URIPrefix.API + URIPrefix.V1 + URIPathVariable.YOUTUBE_PERMISSION_SERVICE)
+public class YoutubePermissionController {
+
+ @Autowired
+ private YoutubePermissionService youtubePermissionService;
+
+
+}
+
diff --git a/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-docker.properties b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-docker.properties
new file mode 100644
index 0000000..24314e1
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-docker.properties
@@ -0,0 +1,26 @@
+server.port=8095
+spring.application.name=youtube-permission-manager
+#logging.level.org.springframework.core.env=DEBUG
+
+
+
+#RabbitMQ Configuration
+spring.rabbitmq.host=192.168.1.87
+spring.rabbitmq.port=5673
+spring.rabbitmq.username=admin
+spring.rabbitmq.password=admin
+rabbitmq.exchanges.internal=internal.exchange
+rabbitmq.queue.permissionGrant=permission.grant.queue
+rabbitmq.queue.permissionRevoke=permission.revoke.queue
+rabbitmq.routing-keys.permissionGrant=permission.grant.routing-key
+rabbitmq.routing-keys.permissionRevoke=permission.revoke.routing-key
+
+#eureka
+eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka/
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.instance.prefer-ip-address=true
+
+
+
+
diff --git a/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-kube.properties b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-kube.properties
new file mode 100644
index 0000000..81961a0
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-kube.properties
@@ -0,0 +1,16 @@
+server.port=8099
+spring.application.name=dms-mediator
+#logging.level.org.springframework.core.env=DEBUG
+
+#RabbitMQ Configuration
+spring.rabbitmq.host=192.168.1.87
+spring.rabbitmq.port=5673
+spring.rabbitmq.username=admin
+spring.rabbitmq.password=admin
+rabbitmq.exchanges.internal=internal.exchange
+rabbitmq.queue.permissionGrant=permission.grant.queue
+rabbitmq.queue.permissionRevoke=permission.revoke.queue
+rabbitmq.routing-keys.permissionGrant=permission.grant.routing-key
+rabbitmq.routing-keys.permissionRevoke=permission.revoke.routing-key
+
+
diff --git a/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application.properties b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application.properties
new file mode 100644
index 0000000..3758a7b
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+server.port=8095
+spring.application.name=youtube-permission-manager
+#logging.level.org.springframework.core.env=DEBUG
+spring.profiles.active=stg
+
+
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/pom.xml b/youtube-permission-manager/youtube-permission-manager-dao/pom.xml
new file mode 100644
index 0000000..9cb6452
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/pom.xml
@@ -0,0 +1,63 @@
+
+ 4.0.0
+
+ com.itgura.lms
+ youtube-permission-manager
+ 1.0.0
+
+ jar
+ youtube-permission-manager-dao
+
+ UTF-8
+
+
+
+
+ com.itgura.lms
+ lib-common
+ 0.0.1
+
+
+ com.itgura.lms
+ lib-global
+ 0.0.1
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ 4.25.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ jib-execution
+
+ build
+
+ none
+
+
+
+
+
+
\ No newline at end of file
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/config/permissionConfig.java b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/config/permissionConfig.java
new file mode 100644
index 0000000..8e43ab5
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/config/permissionConfig.java
@@ -0,0 +1,15 @@
+package com.itgura.config;
+
+import com.itgura.util.DummyEntityManagerFactory;
+import jakarta.persistence.EntityManagerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class permissionConfig {
+ @Bean
+ public EntityManagerFactory entityManagerFactory() {
+ // Implement a dummy EntityManagerFactory
+ return new DummyEntityManagerFactory();
+ }
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
new file mode 100644
index 0000000..eff6e34
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
@@ -0,0 +1,16 @@
+package com.itgura.request.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PermissionGrantDto {
+ private String videoUrl;
+ private List emails;
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
new file mode 100644
index 0000000..92710ae
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
@@ -0,0 +1,17 @@
+package com.itgura.request.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PermissionRevokeDto {
+ private String videoUrl;
+ private List emails;
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/util/DummyEntityManagerFactory.java b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/util/DummyEntityManagerFactory.java
new file mode 100644
index 0000000..7eef915
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/util/DummyEntityManagerFactory.java
@@ -0,0 +1,91 @@
+package com.itgura.util;
+
+import jakarta.persistence.*;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.metamodel.Metamodel;
+
+import java.util.Map;
+
+
+
+public class DummyEntityManagerFactory implements EntityManagerFactory {
+
+ @Override
+ public EntityManager createEntityManager() {
+ throw new UnsupportedOperationException("Not supported.");
+ }
+
+ @Override
+ public EntityManager createEntityManager(Map map) {
+ return null;
+ }
+
+
+ @Override
+ public EntityManager createEntityManager(SynchronizationType synchronizationType) {
+ throw new UnsupportedOperationException("Not supported.");
+ }
+
+ @Override
+ public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
+ return null;
+ }
+
+ @Override
+ public CriteriaBuilder getCriteriaBuilder() {
+ return null;
+ }
+
+ @Override
+ public Metamodel getMetamodel() {
+ return null;
+ }
+
+ // Implement all abstract methods with minimal or no functionality
+ // and throw UnsupportedOperationException for methods that are called to make debugging easier.
+
+
+
+ @Override
+ public boolean isOpen() {
+ // Return false or true based on your dummy implementation needs
+ return false;
+ }
+
+ @Override
+ public void close() {
+ // Since it's a dummy, no action is required here
+ }
+
+ @Override
+ public Map getProperties() {
+ return null;
+ }
+
+ @Override
+ public Cache getCache() {
+ return null;
+ }
+
+ @Override
+ public PersistenceUnitUtil getPersistenceUnitUtil() {
+ return null;
+ }
+
+ @Override
+ public void addNamedQuery(String name, Query query) {
+
+ }
+
+ @Override
+ public T unwrap(Class cls) {
+ return null;
+ }
+
+ @Override
+ public void addNamedEntityGraph(String graphName, EntityGraph entityGraph) {
+
+ }
+
+
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-dev.properties b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-dev.properties
new file mode 100644
index 0000000..204b28c
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-dev.properties
@@ -0,0 +1,12 @@
+
+#RabbitMQ Configurations
+
+spring.rabbitmq.host = localhost
+spring.rabbitmq.port = 5672
+spring.rabbitmq.username = guest
+spring.rabbitmq.password = guest
+rabbitmq.exchanges.internal=internal.exchange
+rabbitmq.queue.permissionGrant=permission.grant.queue
+rabbitmq.queue.permissionRevoke=permission.revoke.queue
+rabbitmq.routing-keys.permissionGrant=permission.grant.routing-key
+rabbitmq.routing-keys.permissionRevoke=permission.revoke.routing-key
\ No newline at end of file
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-prod.properties b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-prod.properties
new file mode 100644
index 0000000..2b8b67c
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-prod.properties
@@ -0,0 +1,11 @@
+#RabbitMQ Configurations
+
+spring.rabbitmq.host = localhost
+spring.rabbitmq.port = 5672
+spring.rabbitmq.username = guest
+spring.rabbitmq.password = guest
+rabbitmq.exchanges.internal=internal.exchange
+rabbitmq.queue.permissionGrant=permission.grant.queue
+rabbitmq.queue.permissionRevoke=permission.revoke.queue
+rabbitmq.routing-keys.permissionGrant=permission.grant.routing-key
+rabbitmq.routing-keys.permissionRevoke=permission.revoke.routing-key
diff --git a/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-stg.properties b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-stg.properties
new file mode 100644
index 0000000..f19678f
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-stg.properties
@@ -0,0 +1,28 @@
+#RabbitMQ Configurations
+spring.rabbitmq.host = localhost
+spring.rabbitmq.port = 5672
+spring.rabbitmq.username = guest
+spring.rabbitmq.password = guest
+rabbitmq.exchanges.internal=internal.exchange
+rabbitmq.queue.permissionGrant=permission.grant.queue
+rabbitmq.queue.permissionRevoke=permission.revoke.queue
+rabbitmq.routing-keys.permissionGrant=permission.grant.routing-key
+rabbitmq.routing-keys.permissionRevoke=permission.revoke.routing-key
+
+#eureka
+eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.instance.prefer-ip-address=true
+
+#swagger
+#server.servlet.context-path=/
+#
+#openapi.service.title=Document Mediator
+#openapi.service.version=1.0
+#openapi.service.url=http://localhost:8081
+#springdoc.api-docs.path=dms-mediator/v3/api-docs
+#springdoc.swagger-ui.path=dms-mediator/swagger-ui.html
+
+
+
diff --git a/youtube-permission-manager/youtube-permission-manager-service/pom.xml b/youtube-permission-manager/youtube-permission-manager-service/pom.xml
new file mode 100644
index 0000000..dd7fb41
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ com.itgura.lms
+ youtube-permission-manager
+ 1.0.0
+
+ jar
+ youtube-permission-manager-service
+
+
+
+ com.itgura.lms
+ youtube-permission-manager-dao
+ 1.0.0
+ compile
+
+
+ org.json
+ json
+ 20231013
+
+
+ commons-io
+ commons-io
+ 2.15.1
+
+
+
+
+
+
+
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
+
+ jib-execution
+
+ build
+
+ none
+
+
+
+
+
+
\ No newline at end of file
diff --git a/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionConsumer.java b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionConsumer.java
new file mode 100644
index 0000000..217df4c
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionConsumer.java
@@ -0,0 +1,9 @@
+package com.itgura.service;
+
+import com.itgura.request.dto.PermissionGrantDto;
+import com.itgura.request.dto.PermissionRevokeDto;
+
+public interface YoutubePermissionConsumer {
+ void consumer(PermissionGrantDto permissionGrantDto);
+ void consumer(PermissionRevokeDto permissionRevokeDto); ;
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionService.java b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionService.java
new file mode 100644
index 0000000..2e18b0e
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionService.java
@@ -0,0 +1,12 @@
+package com.itgura.service;
+
+
+import java.util.List;
+
+public interface YoutubePermissionService {
+
+ void grantPermission(String url, List emails);
+ void revokePermission(String url, List emails);
+
+
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/config/youtubePermissionManagerConfig.java b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/config/youtubePermissionManagerConfig.java
new file mode 100644
index 0000000..f5fe6d6
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/config/youtubePermissionManagerConfig.java
@@ -0,0 +1,72 @@
+package com.itgura.service.config;
+
+
+
+
+import lombok.Getter;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Getter
+public class youtubePermissionManagerConfig {
+ @Value("${rabbitmq.exchanges.internal}")
+ private String internalExchange;
+
+ @Value("${rabbitmq.queue.permissionGrant}")
+ private String permissionGrantQueue;
+
+ @Value("${rabbitmq.queue.permissionRevoke}")
+ private String permissionRevokeQueue;
+
+ @Value("${rabbitmq.routing-keys.permissionGrant}")
+ private String permissionGrantRoutingKey;
+
+ @Value("${rabbitmq.routing-keys.permissionRevoke}")
+ private String permissionRevokeRoutingKey;
+
+
+ @Bean
+ public TopicExchange internalTopicExchange() {
+ return new TopicExchange(this.internalExchange);
+ }
+
+ @Bean
+ public Queue permissionGrantQueue() {
+ return new Queue(this.permissionGrantQueue);
+ }
+
+ @Bean
+ public Queue permissionRevokeQueue() {
+ return new Queue(this.permissionRevokeQueue);
+ }
+
+ @Bean
+ public Binding permissionGrantBinding() {
+ return BindingBuilder
+ .bind(permissionGrantQueue())
+ .to(internalTopicExchange())
+ .with(permissionGrantRoutingKey);
+ }
+
+ @Bean
+ public Binding permissionRevokeBinding() {
+ return BindingBuilder
+ .bind(permissionRevokeQueue())
+ .to(internalTopicExchange())
+ .with(permissionRevokeRoutingKey);
+ }
+
+
+
+ // @Bean
+// public EntityManagerFactory entityManagerFactory() {
+// // Implement a dummy EntityManagerFactory
+// return new DummyEntityManagerFactory();
+// }
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionConsumerImpl.java b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionConsumerImpl.java
new file mode 100644
index 0000000..6775000
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionConsumerImpl.java
@@ -0,0 +1,34 @@
+package com.itgura.service.impl;
+
+import com.itgura.request.dto.PermissionGrantDto;
+import com.itgura.request.dto.PermissionRevokeDto;
+import com.itgura.service.YoutubePermissionConsumer;
+import com.itgura.service.YoutubePermissionService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class YoutubePermissionConsumerImpl implements YoutubePermissionConsumer {
+
+ @Autowired
+ private YoutubePermissionService youtubePermissionService;
+ @Override
+ @RabbitListener(queues = "${rabbitmq.queue.permissionGrant}")
+ public void consumer(PermissionGrantDto permissionGrantDto) {
+ log.info("Consumed {} from Queue", permissionGrantDto);
+ youtubePermissionService.grantPermission(permissionGrantDto.getVideoUrl(), permissionGrantDto.getEmails());
+
+ }
+
+ @Override
+ @RabbitListener(queues = "${rabbitmq.queue.permissionRevoke}")
+ public void consumer(PermissionRevokeDto permissionRevokeDto) {
+ log.info("Consumed {} from Queue", permissionRevokeDto);
+ youtubePermissionService.revokePermission(permissionRevokeDto.getVideoUrl(), permissionRevokeDto.getEmails());
+ }
+}
diff --git a/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionServiceImpl.java b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionServiceImpl.java
new file mode 100644
index 0000000..28c3626
--- /dev/null
+++ b/youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionServiceImpl.java
@@ -0,0 +1,171 @@
+package com.itgura.service.impl;
+
+
+
+
+import com.itgura.service.YoutubePermissionService;
+
+
+import jakarta.xml.bind.SchemaOutputResolver;
+import org.openqa.selenium.*;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.time.Duration;
+import java.util.List;
+import java.util.Scanner;
+import java.util.Set;
+
+
+@Service
+public class YoutubePermissionServiceImpl implements YoutubePermissionService {
+
+
+ private static final String COOKIES_YOUTUBE_COOKIES_DATA = "cookies/youtube_cookies.data";
+ private static final String channelId = "UC1l4Zf3f5d2Xg1J9A6ZJ9xg";
+ @Override
+ public void grantPermission(String url, List emails) {
+ // ToDo:Implement Selenium code here
+ System.out.println("Selenium Permission Part Initializing.......");
+ WebDriver driver = new ChromeDriver();
+
+ loadCookies(driver, COOKIES_YOUTUBE_COOKIES_DATA);
+
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ if (!isLoggedInYoutube(driver)) {
+ System.out.println("Please manually log in to continue...");
+ waitForManualLoginYoutube(driver);
+ saveCookies(driver, COOKIES_YOUTUBE_COOKIES_DATA);
+ }
+ // Split the URL by "/" and get the last part
+ String videoId = url.substring(url.lastIndexOf("/") + 1);
+ driver.get("https://studio.youtube.com/video/${videoId}/edit");
+ //wait for the page to load
+ try {
+ Thread.sleep(7000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ WebElement visibilityDropDownButton = driver.findElement(
+ By.xpath("//ytcp-icon-button[@id='select-button' and @aria-label='Edit video visibility status']")
+ );
+ visibilityDropDownButton.click();
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ WebElement editMailsButton = driver.findElement(
+ By.xpath("//ytcp-button[@aria-label='Share privately' and contains(@class, 'private-share-edit-button')]")
+ );
+ editMailsButton.click();
+
+ WebElement inviteesInput = driver.findElement(
+ By.xpath("//input[@id='text-input' and @aria-label='Invitees']")
+ );
+ inviteesInput.sendKeys(String.join(",", emails));
+ inviteesInput.sendKeys(Keys.ENTER);
+
+ WebElement doneButton = driver.findElement(
+ By.xpath("//ytcp-button[@aria-label='Done']")
+ );
+ doneButton.click();
+ WebElement nextDoneButton = driver.findElement(
+ By.xpath("//ytcp-button[@aria-label='Done']")
+ );
+ nextDoneButton.click();
+ WebElement saveButton = driver.findElement(
+ By.xpath("//ytcp-button[@aria-label='Save']")
+ );
+ saveButton.click();
+
+ try {
+ Thread.sleep(8000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static void saveCookies(WebDriver driver,String filePath) {
+ File file = new File(filePath);
+ File directory = file.getParentFile();
+
+ if (directory != null && !directory.exists()) {
+ directory.mkdirs(); // Create the directory if it doesn't exist
+ }
+
+ try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file))) {
+ Set cookies = driver.manage().getCookies();
+ outputStream.writeObject(cookies);
+ System.out.println("Cookies have been saved to " + file.getAbsolutePath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void waitForManualLoginYoutube(WebDriver driver) {
+ Scanner scanner = new Scanner(System.in);
+
+ System.out.println("Please manually log in to the site, then press Enter to continue...");
+
+ // Wait for user input in the command line to confirm they've logged in
+ scanner.nextLine();
+
+ // Now check if the user is logged in
+ if (isLoggedInYoutube(driver)) {
+ System.out.println("Login successful, continuing with automation...");
+ } else {
+ System.out.println("Login not detected. Please log in and press Enter again.");
+ waitForManualLoginYoutube(driver); // Recursively wait until login is detected
+ }
+ }
+
+ private boolean isLoggedInYoutube(WebDriver driver) {
+ driver.get("https://www.youtube.com/");
+ WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(8));
+ try {
+ // Attempt to find the specific input field that indicates a successful login
+ WebElement loginButton = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[@aria-label=\"Sign in\"]") ));
+
+ return !loginButton.isDisplayed();
+ } catch (Exception e) {
+ // If the element is not found, it means the login was successful
+ return true;
+ }
+ }
+
+ private void loadCookies(WebDriver driver, String filePath) {
+ File file = new File(filePath);
+ if (file.exists() && file.isFile()) {
+ try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file))) {
+ Set cookies = (Set) inputStream.readObject();
+ // Navigate to the correct domain before adding cookies
+ driver.get("https://www.youtube.com/");
+
+ for (Cookie cookie : cookies) {
+ driver.manage().addCookie(cookie);
+ }
+ System.out.println("Cookies loaded successfully.");
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void revokePermission(String url, List emails) {
+ //ToDo:Implement Selenium code here
+ }
+}
+
+
From 7364747048ad9e22b29c2b54376ab7cefb30cc35 Mon Sep 17 00:00:00 2001
From: Yesitha Sathsara <60166952+yesitha@users.noreply.github.com>
Date: Wed, 25 Dec 2024 06:07:45 +0530
Subject: [PATCH 10/11] remove youtube permission manager
---
.gitignore | 1 +
auth-service/pom.xml | 4 -
.../config/CustomOAuth2FailureHandler.java | 29 ---
.../config/CustomOAuth2SuccessHandler.java | 59 ------
.../config/SecurityConfiguration.java | 36 +---
.../controller/AuthenticationController.java | 53 ++---
.../com/itgura/authservice/entity/User.java | 10 +-
.../services/AuthenticationService.java | 95 +++------
.../services/CustomOAuth2UserService.java | 30 ---
.../src/main/resources/application.properties | 14 +-
.../eurekaserver/EurekaServerApplication.java | 3 -
lib-common/pom.xml | 5 -
.../com/itgura/config/RabbitMQConfig.java | 46 -----
.../itgura/util/rabbitMQMessageProducer.java | 21 --
.../itgura/util/ResourceManagementURI.java | 8 +
.../java/com/itgura/util/URIPathVariable.java | 3 +-
.../main/java/com/itgura/util/URIPrefix.java | 2 -
lms-gateway/pom.xml | 7 -
.../itgura/lmsgateway/config/AppConfig.java | 7 +-
.../filter/OAuth2PathRewriteFilter.java | 40 ----
.../lmsgateway/filter/RouteValidator.java | 4 +-
.../src/main/resources/application.properties | 38 ++--
.../controller/PaymentController.java | 2 -
.../controller/PermissionController.java | 11 +-
.../StudentTransactionContentRepository.java | 3 -
.../service/PermissionService.java | 2 -
.../service/impl/PaymentServiceImpl.java | 31 +--
.../service/impl/PermissionServiceImpl.java | 60 +-----
pom.xml | 2 +-
.../pom.xml | 34 ++-
.../quiz-management-all}/pom.xml | 23 ++-
.../src/main/java/com/itgura/QuizMain.java | 16 ++
.../com/itgura/config/SecurityConfig.java | 101 +++++++++
.../controller/AssignmentController.java | 87 ++++++++
.../com/itgura/controller/QuizController.java | 91 ++++++++
.../src/main/resources/application.properties | 6 +
quiz-management/quiz-management-dao/pom.xml | 85 ++++++++
.../java/com/itgura/entity/Assignment.java | 68 ++++++
.../itgura/entity/AssignmentSubmission.java | 53 +++++
.../java/com/itgura/entity/MCQOption.java | 40 ++++
.../main/java/com/itgura/entity/Question.java | 63 ++++++
.../com/itgura/entity/QuestionAnswer.java | 48 +++++
.../java/com/itgura/entity/QuestionFile.java | 34 +++
.../java/com/itgura/entity/QuestionType.java | 8 +
.../src/main/java/com/itgura/entity/Quiz.java | 71 +++++++
.../com/itgura/entity/QuizSubmission.java | 59 ++++++
.../repository/AssignmentRepository.java | 15 ++
.../itgura/repository/QuestionRepository.java | 15 ++
.../com/itgura/repository/QuizRepository.java | 17 ++
.../request/CreateAssignmentRequest.java | 26 +++
.../com/itgura/request/CreateQuizRequest.java | 49 +++++
.../main/java/com/itgura/request/FileDTO.java | 13 +-
.../java/com/itgura/request/OptionDTO.java | 16 +-
.../java/com/itgura/request/QuestionDTO.java | 20 ++
.../itgura/response/AssignmentResponse.java | 24 +++
.../itgura/response/AssignmentSummaryDTO.java | 22 ++
.../itgura/response/MCQOptionResponse.java | 17 ++
.../response/QuestionAnswerResponse.java | 20 ++
.../itgura/response/QuestionFileResponse.java | 17 ++
.../com/itgura/response/QuestionResponse.java | 28 +++
.../com/itgura/response/QuizResponse.java | 21 ++
.../com/itgura/response/QuizSummaryDTO.java | 24 +++
.../main/resources/application-dev.properties | 34 +++
.../resources/application-prod.properties | 25 +++
.../quiz-management-service/pom.xml | 28 +++
.../com/itgura/service/AssignmentService.java | 16 ++
.../java/com/itgura/service/QuizService.java | 17 ++
.../service/impl/AssignmentServiceImpl.java | 102 +++++++++
.../itgura/service/impl/QuizServiceImpl.java | 195 ++++++++++++++++++
.../main/java/com/itgura/ResourceMain.java | 29 ---
.../itgura/controller/SessionController.java | 11 -
.../itgura/controller/sampleController.java | 14 --
.../itgura/repository/MaterialRepository.java | 6 -
.../main/resources/application-dev.properties | 7 +-
.../resources/application-prod.properties | 6 -
.../com/itgura/service/SessionService.java | 1 -
.../service/impl/MaterialServiceImpl.java | 75 -------
.../service/impl/SessionServiceImpl.java | 35 ----
.../itgura/YoutubePermissionManagerMain.java | 35 ----
.../YoutubePermissionController.java | 22 --
.../resources/application-docker.properties | 26 ---
.../resources/application-kube.properties | 16 --
.../src/main/resources/application.properties | 6 -
.../youtube-permission-manager-dao/pom.xml | 63 ------
.../com/itgura/config/permissionConfig.java | 15 --
.../request/dto/PermissionGrantDto.java | 16 --
.../request/dto/PermissionRevokeDto.java | 17 --
.../util/DummyEntityManagerFactory.java | 91 --------
.../main/resources/application-dev.properties | 12 --
.../resources/application-prod.properties | 11 -
.../main/resources/application-stg.properties | 28 ---
.../pom.xml | 53 -----
.../service/YoutubePermissionConsumer.java | 9 -
.../service/YoutubePermissionService.java | 12 --
.../youtubePermissionManagerConfig.java | 72 -------
.../impl/YoutubePermissionConsumerImpl.java | 34 ---
.../impl/YoutubePermissionServiceImpl.java | 171 ---------------
97 files changed, 1699 insertions(+), 1468 deletions(-)
delete mode 100644 auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
delete mode 100644 auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
delete mode 100644 auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
delete mode 100644 lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
delete mode 100644 lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
delete mode 100644 lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
rename {youtube-permission-manager => quiz-management}/pom.xml (75%)
rename {youtube-permission-manager/youtube-permission-manager-all => quiz-management/quiz-management-all}/pom.xml (75%)
create mode 100644 quiz-management/quiz-management-all/src/main/java/com/itgura/QuizMain.java
create mode 100644 quiz-management/quiz-management-all/src/main/java/com/itgura/config/SecurityConfig.java
create mode 100644 quiz-management/quiz-management-all/src/main/java/com/itgura/controller/AssignmentController.java
create mode 100644 quiz-management/quiz-management-all/src/main/java/com/itgura/controller/QuizController.java
create mode 100644 quiz-management/quiz-management-all/src/main/resources/application.properties
create mode 100644 quiz-management/quiz-management-dao/pom.xml
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/Assignment.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/AssignmentSubmission.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/MCQOption.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/Question.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/QuestionAnswer.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/QuestionFile.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/QuestionType.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/Quiz.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/entity/QuizSubmission.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/repository/AssignmentRepository.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/repository/QuestionRepository.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/repository/QuizRepository.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/request/CreateAssignmentRequest.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/request/CreateQuizRequest.java
rename resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java => quiz-management/quiz-management-dao/src/main/java/com/itgura/request/FileDTO.java (52%)
rename resource-management/resource-management-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java => quiz-management/quiz-management-dao/src/main/java/com/itgura/request/OptionDTO.java (50%)
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/request/QuestionDTO.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/AssignmentResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/AssignmentSummaryDTO.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/MCQOptionResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/QuestionAnswerResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/QuestionFileResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/QuestionResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/QuizResponse.java
create mode 100644 quiz-management/quiz-management-dao/src/main/java/com/itgura/response/QuizSummaryDTO.java
create mode 100644 quiz-management/quiz-management-dao/src/main/resources/application-dev.properties
create mode 100644 quiz-management/quiz-management-dao/src/main/resources/application-prod.properties
create mode 100644 quiz-management/quiz-management-service/pom.xml
create mode 100644 quiz-management/quiz-management-service/src/main/java/com/itgura/service/AssignmentService.java
create mode 100644 quiz-management/quiz-management-service/src/main/java/com/itgura/service/QuizService.java
create mode 100644 quiz-management/quiz-management-service/src/main/java/com/itgura/service/impl/AssignmentServiceImpl.java
create mode 100644 quiz-management/quiz-management-service/src/main/java/com/itgura/service/impl/QuizServiceImpl.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/YoutubePermissionManagerMain.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/java/com/itgura/controller/YoutubePermissionController.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-docker.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application-kube.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-all/src/main/resources/application.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/pom.xml
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/config/permissionConfig.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionGrantDto.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/request/dto/PermissionRevokeDto.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/java/com/itgura/util/DummyEntityManagerFactory.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-dev.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-prod.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-dao/src/main/resources/application-stg.properties
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/pom.xml
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionConsumer.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/YoutubePermissionService.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/config/youtubePermissionManagerConfig.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionConsumerImpl.java
delete mode 100644 youtube-permission-manager/youtube-permission-manager-service/src/main/java/com/itgura/service/impl/YoutubePermissionServiceImpl.java
diff --git a/.gitignore b/.gitignore
index 511fc24..f54ed0a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,4 @@ auth-service/mvnw.cmd
resource-management/resource-management-all/target/resource-management-all-1.0.0.jar.original
*.lst
/target/*
+auth-service/src/main/resources/application.properties
diff --git a/auth-service/pom.xml b/auth-service/pom.xml
index 81cdf5d..a043a7a 100644
--- a/auth-service/pom.xml
+++ b/auth-service/pom.xml
@@ -26,10 +26,6 @@
org.springframework.boot
spring-boot-starter-security
-
- org.springframework.boot
- spring-boot-starter-oauth2-client
-
org.springframework.boot
spring-boot-starter-web
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
deleted file mode 100644
index 1662b25..0000000
--- a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2FailureHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.itgura.authservice.config;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.itgura.dto.AppResponse;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.web.authentication.AuthenticationFailureHandler;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-@Component
-public class CustomOAuth2FailureHandler implements AuthenticationFailureHandler {
-
-
- @Override
- public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.AuthenticationException exception) throws IOException, ServletException {
- response.setStatus(HttpStatus.UNAUTHORIZED.value());
- response.setContentType("application/json");
- response.getWriter().write(
- new ObjectMapper().writeValueAsString(
- AppResponse.error(null, "Unauthorized", "401", "", exception.getMessage())
- )
- );
- response.getWriter().flush();
- }
-}
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java b/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
deleted file mode 100644
index e65c745..0000000
--- a/auth-service/src/main/java/com/itgura/authservice/config/CustomOAuth2SuccessHandler.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.itgura.authservice.config;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.itgura.authservice.dto.response.AuthenticationResponse;
-import com.itgura.authservice.services.AuthenticationService;
-import com.itgura.authservice.services.JwtService;
-import com.itgura.dto.AppResponse;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.oauth2.core.user.OAuth2User;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-
-
-@Component
-public class CustomOAuth2SuccessHandler implements AuthenticationSuccessHandler {
-
-// @Value("${app.dashboard.url}")
-// private String DashboardUrl;
-
-
- private final AuthenticationService authenticationService;
-
- public CustomOAuth2SuccessHandler( AuthenticationService authenticationService) {
- this.authenticationService = authenticationService;
- }
-
-
- @Override
- public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
- // Get the authenticated user's details from OAuth2
- OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal();
-
-
- // Process user login/registration in your AuthenticationService
- AuthenticationResponse authResponse = authenticationService.processOAuthPostLogin(oAuth2User);
-
-// //Crate AppResponse
- AppResponse appResponse = AppResponse.ok(authResponse);
- // Send the AppResponse in the response body as JSON
- response.setContentType("application/json");
- response.getWriter().write(
- new ObjectMapper().writeValueAsString(appResponse) // Serialize to JSON using ObjectMapper
- );
- response.getWriter().flush();
-// String dashboardUrl = DashboardUrl; // Or your actual dashboard URL
-//
-//// Perform the redirect
-// response.sendRedirect(dashboardUrl);
- }
-}
\ No newline at end of file
diff --git a/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java b/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
index 8d5387c..dbd3e97 100644
--- a/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
+++ b/auth-service/src/main/java/com/itgura/authservice/config/SecurityConfiguration.java
@@ -2,11 +2,10 @@
import com.itgura.authservice.entity.Role;
-import com.itgura.authservice.services.CustomOAuth2UserService;
import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
@@ -18,26 +17,14 @@
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {
- @Autowired
- private JwtAuthenticationFilter jwtAuthFilter;
-
- @Autowired
- private CustomOAuth2SuccessHandler customOAuth2SuccessHandler;
- @Autowired
- private CustomOAuth2FailureHandler customOAuth2FailureHandler;
- @Autowired
- private CustomOAuth2UserService CustomOAuth2UserService;
-
-
+ private final JwtAuthenticationFilter jwtAuthFilter;
+ private final AuthenticationProvider authenticationProvider;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-
-
-
http.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(request->request.requestMatchers(
"/api/v1/auth-service/**", // Your specific API access,
@@ -53,25 +40,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.anyRequest().authenticated())
.sessionManagement(manager->manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
-// .authenticationProvider(authenticationProvider)
-
- // Enabling OAuth2 login and defining success handler
- .oauth2Login(oauth2 -> oauth2
-// .loginPage("/login") // Custom login page if any
-// .defaultSuccessUrl("https://github.com") // URL after successful login
- .successHandler(customOAuth2SuccessHandler) // Custom success handler
- .failureHandler(customOAuth2FailureHandler) // Custom failure handler
- .userInfoEndpoint(userInfo -> userInfo
- .userService(CustomOAuth2UserService))) // Custom OAuth2 user service
-
-
+ .authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class) ;
return http.build();
}
-
-
-
-
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
index 5631d5d..69be616 100644
--- a/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
+++ b/auth-service/src/main/java/com/itgura/authservice/controller/AuthenticationController.java
@@ -9,7 +9,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
-import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.*;
@RestController
@@ -20,38 +19,28 @@ public class AuthenticationController {
@Autowired
private final AuthenticationService authenticationService;
-// @PostMapping("/register")
-// public AppResponse register(@RequestBody RegisterRequest registerRequest){
-// try {
-// AuthenticationResponse res = authenticationService.register(registerRequest);
-// return AppResponse.ok(res);
-// } catch (Exception e) {
-// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
-// }
-//
-// }
-//
-// @PostMapping("/authenticate")
-// public AppResponse register(@RequestBody AuthenticationRequest authenticationRequest){
-// try {
-// AuthenticationResponse res = authenticationService.authenticate(authenticationRequest);
-// return AppResponse.ok(res);
-// } catch (Exception e) {
-// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
-//
-// }
-//
-// }
+ @PostMapping("/register")
+ public AppResponse register(@RequestBody RegisterRequest registerRequest){
+ try {
+ AuthenticationResponse res = authenticationService.register(registerRequest);
+ return AppResponse.ok(res);
+ } catch (Exception e) {
+ return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
+ }
+
+ }
-// @PostMapping("/getAccessToken")
-// public AppResponse getAccessToken(OAuth2AuthenticationToken auth){
-// try {
-// AuthenticationResponse res = authenticationService.getAccessToken(auth);
-// return AppResponse.ok(res);
-// } catch (Exception e) {
-// return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
-// }
-// }
+ @PostMapping("/authenticate")
+ public AppResponse register(@RequestBody AuthenticationRequest authenticationRequest){
+ try {
+ AuthenticationResponse res = authenticationService.authenticate(authenticationRequest);
+ return AppResponse.ok(res);
+ } catch (Exception e) {
+ return AppResponse.error(null, "Server Error", "500", "", e.getMessage());
+
+ }
+
+ }
@PostMapping("/refresh")
public AppResponse refresh(@RequestParam("token") String refreshToken){
diff --git a/auth-service/src/main/java/com/itgura/authservice/entity/User.java b/auth-service/src/main/java/com/itgura/authservice/entity/User.java
index 39ff9de..2544ae1 100644
--- a/auth-service/src/main/java/com/itgura/authservice/entity/User.java
+++ b/auth-service/src/main/java/com/itgura/authservice/entity/User.java
@@ -27,6 +27,7 @@ public class User implements UserDetails {
private String firstName;
private String lastName;
private String email;
+ private String password;
@Enumerated(EnumType.STRING)
private Role role;
@@ -35,11 +36,6 @@ public Collection extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority(role.name()));
}
- @Override
- public String getPassword() {
- return "";
- }
-
@Override
public String getUsername() {
return this.email;
@@ -65,4 +61,8 @@ public boolean isEnabled() {
return true;
}
+ @Override
+ public String getPassword() {
+ return this.password;
+ }
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java b/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
index ced8a45..d58aa6c 100644
--- a/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
+++ b/auth-service/src/main/java/com/itgura/authservice/services/AuthenticationService.java
@@ -6,13 +6,10 @@
import com.itgura.authservice.entity.Role;
import com.itgura.authservice.entity.User;
import com.itgura.authservice.repository.UserRepository;
-import jakarta.ws.rs.NotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
-import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@@ -21,66 +18,38 @@
@RequiredArgsConstructor
public class AuthenticationService {
private final UserRepository userRepository;
-// private final PasswordEncoder passwordEncoder;
+ private final PasswordEncoder passwordEncoder;
private final JwtService jwtService;
-// private final AuthenticationManager authenticationManager;
-
-// public AuthenticationResponse register(RegisterRequest registerRequest) {
-// var user = User.builder()
-// .firstName(registerRequest.getFirstName())
-// .lastName(registerRequest.getLastName())
-// .email(registerRequest.getEmail())
-// .password(passwordEncoder.encode(registerRequest.getPassword()))
-// .role(Role.STUDENT)
-// .build();
-// userRepository.save(user);
-// var jwtToken = jwtService.generateToken(user);
-// var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
-// return AuthenticationResponse.builder()
-// .authenticationToken(jwtToken)
-// .refreshToken(refreshToken)
-// .build();
-// }
-//
-// public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest) {
-// authenticationManager.authenticate(
-// new UsernamePasswordAuthenticationToken(authenticationRequest.getEmail(), authenticationRequest.getPassword())
-// );
-// var user = userRepository.findByEmail(authenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Invalid email or password"));
-// var jwtToken = jwtService.generateToken(user);
-// var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
-// return AuthenticationResponse.builder()
-// .authenticationToken(jwtToken)
-// .refreshToken(refreshToken)
-// .build();
-// }
-
- // This method is invoked after a successful Google OAuth2 login
- public AuthenticationResponse processOAuthPostLogin(OAuth2User oAuth2User) {
- String email = oAuth2User.getAttribute("email");
-
- // Check if the user already exists in your database
- var user = userRepository.findByEmail(email).orElseGet(() -> {
- // Register the user if they don't exist
- User newUser = User.builder()
- .firstName(oAuth2User.getAttribute("given_name")) // Extract first name from OAuth2 user info
- .lastName(oAuth2User.getAttribute("family_name")) // Extract last name
- .email(email)
- .role(Role.STUDENT) // Assign default role (can be dynamic)
- .build();
- return userRepository.save(newUser);
- });
-
- // Generate JWT and refresh token
+ private final AuthenticationManager authenticationManager;
+ public AuthenticationResponse register(RegisterRequest registerRequest) {
+ var user = User.builder()
+ .firstName(registerRequest.getFirstName())
+ .lastName(registerRequest.getLastName())
+ .email(registerRequest.getEmail())
+ .password(passwordEncoder.encode(registerRequest.getPassword()))
+ .role(Role.STUDENT)
+ .build();
+ userRepository.save(user);
var jwtToken = jwtService.generateToken(user);
- var refreshToken = jwtService.generateRefresh(new HashMap<>(), user);
-
+ var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
return AuthenticationResponse.builder()
.authenticationToken(jwtToken)
.refreshToken(refreshToken)
.build();
}
+ public AuthenticationResponse authenticate(AuthenticationRequest authenticationRequest) {
+ authenticationManager.authenticate(
+ new UsernamePasswordAuthenticationToken(authenticationRequest.getEmail(), authenticationRequest.getPassword())
+ );
+ var user = userRepository.findByEmail(authenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Invalid email or password"));
+ var jwtToken = jwtService.generateToken(user);
+ var refreshToken = jwtService.generateRefresh(new HashMap<>(),user);
+ return AuthenticationResponse.builder()
+ .authenticationToken(jwtToken)
+ .refreshToken(refreshToken)
+ .build();
+ }
public AuthenticationResponse refreshToken(String refreshToken) {
@@ -96,20 +65,4 @@ public AuthenticationResponse refreshToken(String refreshToken) {
public Boolean validateToken(String token) {
return jwtService.validateToken(token);
}
-
-// public AuthenticationResponse getAccessToken(OAuth2AuthenticationToken auth) {
-// OAuth2User oAuth2User = auth.getPrincipal();
-// String email = oAuth2User.getAttribute("email");
-//
-// User user = userRepository.findByEmail(email).orElseThrow(() -> new NotFoundException("User not found"));
-//
-// // Generate JWT and refresh token
-// String jwtToken = jwtService.generateToken(user);
-// String refreshToken = jwtService.generateRefresh(new HashMap<>(), user);
-//
-// return AuthenticationResponse.builder()
-// .authenticationToken(jwtToken)
-// .refreshToken(refreshToken)
-// .build();
-// }
}
diff --git a/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java b/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
deleted file mode 100644
index 40ac641..0000000
--- a/auth-service/src/main/java/com/itgura/authservice/services/CustomOAuth2UserService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.itgura.authservice.services;
-
-
-import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
-import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
-import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
-import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
-import org.springframework.security.oauth2.core.user.OAuth2User;
-import org.springframework.stereotype.Service;
-
-@Service
-public class CustomOAuth2UserService implements OAuth2UserService {
-
- private final AuthenticationService authenticationService;
-
- public CustomOAuth2UserService(AuthenticationService authenticationService) {
- this.authenticationService = authenticationService;
- }
-
- @Override
- public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
- DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();
- OAuth2User oAuth2User = delegate.loadUser(userRequest);
-
- // After successful OAuth2 login, pass the OAuth2User to AuthenticationService to process login
- authenticationService.processOAuthPostLogin(oAuth2User);
-
- return oAuth2User;
- }
-}
\ No newline at end of file
diff --git a/auth-service/src/main/resources/application.properties b/auth-service/src/main/resources/application.properties
index a9138f6..f02958b 100644
--- a/auth-service/src/main/resources/application.properties
+++ b/auth-service/src/main/resources/application.properties
@@ -21,19 +21,7 @@ spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
-logging.level.org.springframework.security=DEBUG
-jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
-app.dashboard.url=http://localhost:8081/Frontend/dashboard
-
-#oauth2
-spring.security.oauth2.client.registration.google.client-id=your_app_client_id
-spring.security.oauth2.client.registration.google.client-secret=your_app_client_secret
-spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8081/auth-service/login/oauth2/code/google
-spring.security.oauth2.client.registration.google.scope=profile,email
-spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth
-spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
-spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
-spring.security.oauth2.client.provider.google.user-name-attribute=email
\ No newline at end of file
+jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
\ No newline at end of file
diff --git a/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java b/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
index 9db1393..b9ad44a 100644
--- a/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
+++ b/eureka-server/src/main/java/com/itgura/eurekaserver/EurekaServerApplication.java
@@ -8,11 +8,8 @@
@EnableEurekaServer
public class EurekaServerApplication {
-
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
-
}
-
}
diff --git a/lib-common/pom.xml b/lib-common/pom.xml
index 0b750a8..e1c9468 100644
--- a/lib-common/pom.xml
+++ b/lib-common/pom.xml
@@ -96,11 +96,6 @@
0.12.5
compile
-
- org.springframework.boot
- spring-boot-starter-amqp
-
-
\ No newline at end of file
diff --git a/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java b/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
deleted file mode 100644
index c9ca7ab..0000000
--- a/lib-common/src/main/java/com/itgura/config/RabbitMQConfig.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.itgura.config;
-
-
-import lombok.AllArgsConstructor;
-import org.springframework.amqp.core.AmqpTemplate;
-import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
-import org.springframework.amqp.rabbit.connection.ConnectionFactory;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
-import org.springframework.amqp.support.converter.MessageConverter;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-@AllArgsConstructor
-public class RabbitMQConfig {
- private final ConnectionFactory connectionFactory;
-
- //This allows us to send messages to RabbitMQ
- @Bean
- @Primary
- public AmqpTemplate ampqTemplate() {
- RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
- rabbitTemplate.setMessageConverter(jackSonMessageConverter());
- return rabbitTemplate;
- }
-
- //This allows us to receive messages from RabbitMQ
- @Bean
- public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(){
- SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
- factory.setConnectionFactory(connectionFactory);
- factory.setMessageConverter(jackSonMessageConverter());
- return factory;
-
- }
-
-
- @Bean
- public MessageConverter jackSonMessageConverter() {
- MessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
- return jackson2JsonMessageConverter;
- }
-}
-
diff --git a/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java b/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
deleted file mode 100644
index 0a748f5..0000000
--- a/lib-common/src/main/java/com/itgura/util/rabbitMQMessageProducer.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.itgura.util;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.core.AmqpTemplate;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-@Component
-@Slf4j
-@AllArgsConstructor
-public class rabbitMQMessageProducer {
- @Qualifier("ampqTemplate")
- private final AmqpTemplate amqpTemplate;
-
- public void publish(Object payload, String exchange, String routingKey) {
- log.info("Publishing message to RabbitMQ exchange: {} with routing key: {}. Payload :{}", exchange, routingKey, payload);
- amqpTemplate.convertAndSend(exchange, routingKey, payload);
- log.info("Published message to RabbitMQ exchange: {} with routing key: {}. Payload :{}", exchange, routingKey, payload);
- }
-}
\ No newline at end of file
diff --git a/lib-global/src/main/java/com/itgura/util/ResourceManagementURI.java b/lib-global/src/main/java/com/itgura/util/ResourceManagementURI.java
index 806d2fc..d40420f 100644
--- a/lib-global/src/main/java/com/itgura/util/ResourceManagementURI.java
+++ b/lib-global/src/main/java/com/itgura/util/ResourceManagementURI.java
@@ -16,7 +16,15 @@ public class ResourceManagementURI {
public static final String CLASS_ID = "/{classId}";
public static final String ANNOUNCEMENT = "/announcement";
public static final String ANNOUNCEMENT_ID = "/{announcementId}";
+ public static final String ID = "/{id}";
public static final String CONTENT = "/content";
public static final String TAGS = "/tags";
+ public static final String QUIZ = "/quiz";
+ public static final String ASSIGNMENT = "/assignment";
+ public static final String FORUM = "/forum";
+ public static final String MY = "/my";
+ public static final String REPLY = "/reply";
+ public static final String GET_BY_ID = "/get-by-id";
+ public static final String PUBLISH = "/publish";
}
diff --git a/lib-global/src/main/java/com/itgura/util/URIPathVariable.java b/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
index e34274e..ccd7412 100644
--- a/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
+++ b/lib-global/src/main/java/com/itgura/util/URIPathVariable.java
@@ -15,7 +15,6 @@ public class URIPathVariable {
public static final String PAYMENT_SERVICE = "/payment-service";
+ public static final String QUIZ_SERVICE = "/quiz-service";
public static final String CONTENT_ID = "/{contentId}";
- public static final String SESSION_ID = "/{sessionId}";
- public static final String YOUTUBE_PERMISSION_SERVICE = "/youtube-permission-service";
}
diff --git a/lib-global/src/main/java/com/itgura/util/URIPrefix.java b/lib-global/src/main/java/com/itgura/util/URIPrefix.java
index e4bb7a7..dd0d7ba 100644
--- a/lib-global/src/main/java/com/itgura/util/URIPrefix.java
+++ b/lib-global/src/main/java/com/itgura/util/URIPrefix.java
@@ -27,6 +27,4 @@ public class URIPrefix {
public static final String GET_ACCESS_TIME_DURATION = "/get-access-time-duration";
public static final String GET_PRICE = "/get-price";
public static final String UPDATE_TAGS = "/update-tags";
- public static final String GIVE_PERMISSION_TO_VIDEOS = "/give-permission-to-videos";
- public static final String EMAIL = "/{email}";
}
diff --git a/lms-gateway/pom.xml b/lms-gateway/pom.xml
index d943039..cfcf514 100644
--- a/lms-gateway/pom.xml
+++ b/lms-gateway/pom.xml
@@ -59,13 +59,6 @@
springdoc-openapi-starter-webflux-ui
2.5.0
-
- jakarta.servlet
- jakarta.servlet-api
- 6.1.0
- provided
-
-
org.springdoc
springdoc-openapi-starter-webflux-api
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
index db9b411..cfd5933 100644
--- a/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
+++ b/lms-gateway/src/main/java/com/itgura/lmsgateway/config/AppConfig.java
@@ -4,18 +4,13 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
-import org.springframework.web.filter.ForwardedHeaderFilter;
@Configuration
public class AppConfig {
@Bean
+
public RestTemplate template() {
return new RestTemplate();
}
-
- @Bean
- public ForwardedHeaderFilter forwardedHeaderFilter() {
- return new ForwardedHeaderFilter();
- }
}
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
deleted file mode 100644
index 3311335..0000000
--- a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/OAuth2PathRewriteFilter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.itgura.lmsgateway.filter;
-
-import org.springframework.cloud.gateway.filter.GatewayFilter;
-import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.server.ServerWebExchange;
-
-@Component
-public class OAuth2PathRewriteFilter extends AbstractGatewayFilterFactory {
-
- public static class Config {
- // Put any needed configuration properties here
- }
-
- public OAuth2PathRewriteFilter() {
- super(Config.class);
- }
-
- @Override
- public GatewayFilter apply(Config config) {
- return (exchange, chain) -> {
- ServerWebExchange modifiedExchange = exchange;
-
- // Get the original request path
- String path = exchange.getRequest().getURI().getPath();
-
- // Check if the request is for OAuth2 callback or authorization paths
- if (path.contains("/login/oauth2/code/google") || path.contains("/oauth2/authorization/google")) {
- // Rewrite the path by removing '/api/v1/auth-service'
- String newPath = path.replace("/api/v1/auth-service", "");
-
- // Mutate the request with the new path
- modifiedExchange = exchange.mutate().request(exchange.getRequest().mutate().path(newPath).build()).build();
- }
-
- // Proceed with the filter chain
- return chain.filter(modifiedExchange);
- };
- }
-}
diff --git a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
index 9977028..44c3907 100644
--- a/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
+++ b/lms-gateway/src/main/java/com/itgura/lmsgateway/filter/RouteValidator.java
@@ -17,9 +17,7 @@ public class RouteValidator {
"/auth-service/refresh",
"/auth-service/validateToken",
"/eureka",
- "/resource-management/public",
- "/auth-service/login/oauth2/code/google",
- "auth-service/oauth2/authorization/google"
+ "/resource-management/public"
diff --git a/lms-gateway/src/main/resources/application.properties b/lms-gateway/src/main/resources/application.properties
index 082bc01..6f08052 100644
--- a/lms-gateway/src/main/resources/application.properties
+++ b/lms-gateway/src/main/resources/application.properties
@@ -20,8 +20,6 @@ server.servlet.context-path=/
jwt.secretKey = f2b21eeadc7f3693dbc373dca5f49400293d722eb955353c11250b9367cd1635
-logging.level.org.springframework.cloud.gateway=DEBUG
-
# eureka
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
@@ -55,6 +53,8 @@ spring.cloud.gateway.routes[1].filters[1].args.replacement=/api/v1/dms-mediator/
spring.cloud.gateway.routes[1].filters[0].name=AuthenticationFilter
+
+
#auth-service
spring.cloud.gateway.routes[2].id=auth-service
spring.cloud.gateway.routes[2].uri=lb://auth-service
@@ -65,7 +65,6 @@ spring.cloud.gateway.routes[2].predicates[0].args.pattern=/auth-service/**
spring.cloud.gateway.routes[2].filters[0].name=RewritePath
spring.cloud.gateway.routes[2].filters[0].args.regexp=/auth-service/(?.*)
spring.cloud.gateway.routes[2].filters[0].args.replacement=/api/v1/auth-service/${remaining}
-spring.cloud.gateway.routes[2].filters[1].name=OAuth2PathRewriteFilter
#payment-service
spring.cloud.gateway.routes[3].id=payment-service
@@ -80,24 +79,21 @@ spring.cloud.gateway.routes[3].filters[1].args.replacement=/api/v1/payment-servi
spring.cloud.gateway.routes[3].filters[0].name=AuthenticationFilter
-#
-## OAuth2 callback route - remove '/api/v1/auth-service/' prefix
-#spring.cloud.gateway.routes[4].id=auth-service-oauth2-callback
-#spring.cloud.gateway.routes[4].uri=lb://auth-service
-#spring.cloud.gateway.routes[4].predicates[0].name=Path
-#spring.cloud.gateway.routes[4].predicates[0].args.pattern=/api/v1/auth-service/login/oauth2/code/google
-#spring.cloud.gateway.routes[4].filters[0].name=RewritePath
-#spring.cloud.gateway.routes[4].filters[0].args.regexp=/api/v1/auth-service/(?.*)
-#spring.cloud.gateway.routes[4].filters[0].args.replacement=/${remaining}
-#
-## OAuth2 authorization route - remove '/api/v1/auth-service/' prefix
-#spring.cloud.gateway.routes[5].id=auth-service-oauth2-auth
-#spring.cloud.gateway.routes[5].uri=lb://auth-service
-#spring.cloud.gateway.routes[5].predicates[0].name=Path
-#spring.cloud.gateway.routes[5].predicates[0].args.pattern=/api/v1/auth-service/oauth2/authorization/google
-#spring.cloud.gateway.routes[5].filters[0].name=RewritePath
-#spring.cloud.gateway.routes[5].filters[0].args.regexp=/api/v1/auth-service/(?.*)
-#spring.cloud.gateway.routes[5].filters[0].args.replacement=/${remaining}
+#quiz-management
+spring.cloud.gateway.routes[4].id=quiz-management
+spring.cloud.gateway.routes[4].uri=lb://quiz-management
+spring.cloud.gateway.routes[4].predicates[0].name=Path
+spring.cloud.gateway.routes[4].predicates[0].args.pattern=/quiz-management/**
+
+spring.cloud.gateway.routes[4].filters[1].name=RewritePath
+spring.cloud.gateway.routes[4].filters[1].args.regexp=/quiz-management/(?.*)
+spring.cloud.gateway.routes[4].filters[1].args.replacement=/api/v1/quiz-management/${remaining}
+
+spring.cloud.gateway.routes[4].filters[0].name=AuthenticationFilter
+
+
+
+
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
index d3a2649..127766b 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/controller/PaymentController.java
@@ -138,6 +138,4 @@ public AppResponse saveContentPayment(@Valid @RequestBody AppRequest> hasPermission(@Valid @RequestBody AppRequest request) {
@@ -38,12 +39,4 @@ public AppResponse> hasPermission(@Valid @RequestBod
}
- @PostMapping("/permission/getEmailsHasAccessToSession"+URIPathVariable.SESSION_ID)
- public AppResponse> getEmailsHasAccessToSession(@PathVariable String sessionId) {
- try{
- return AppResponse.ok(permissionService.getEmailsHasAccessToSession(sessionId));
- } catch (Exception e) {
- return null;
- }
- }
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java b/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
index 2f91691..46ac35b 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/repository/StudentTransactionContentRepository.java
@@ -26,7 +26,4 @@ public interface StudentTransactionContentRepository extends JpaRepository findByContentExpireDateBefore(Date currentDate);
-
- @Query("SELECT stc FROM StudentTransactionContent stc WHERE stc.contentId = :uuid")
- List findByContentId(UUID uuid);
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java b/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
index 4b9a38b..4b46c0b 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/PermissionService.java
@@ -9,6 +9,4 @@
public interface PermissionService {
List hasPermission(hasPermissionRequest data) throws ApplicationException;
-
- List getEmailsHasAccessToSession(String sessionId);
}
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
index e891a70..cfaea11 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PaymentServiceImpl.java
@@ -63,14 +63,13 @@ public String saveMonthlyPayment(saveMonthlyPaymentRequest data) throws BadReque
if (data.getPaymentAmount() / months.length == classMonthlyPayment) {
transaction.setAmount(classMonthlyPayment);
Transaction transaction1= transactionRepository.save(transaction);
- //todo: cron job to update studentTransactionContent table - (delete expired contents-done)
+ //todo: cron job to update studentTransactionContent table
List sessionIds = findAllSessionsInMonth(data.getClassId(), Calendar.getInstance().get(Calendar.YEAR), month);
for (UUID sessionId : sessionIds) {
StudentTransactionContent studentTransactionContent = new StudentTransactionContent();
studentTransactionContent.setStudentEmail(data.getStudentEmail());
studentTransactionContent.setContentId(sessionId);
studentTransactionContent.setTransaction(transaction1);
- giveVideosAccessInSession(sessionId,data.getStudentEmail());
}
@@ -84,34 +83,6 @@ public String saveMonthlyPayment(saveMonthlyPaymentRequest data) throws BadReque
}
- private void giveVideosAccessInSession(UUID sessionId, String studentEmail) throws ApplicationException {
- String url = "http://lms-gateway/resource-management/session/give-permission-to-videos/" + sessionId + "/" + studentEmail;
- HttpHeaders headers = new HttpHeaders();
- headers.add("Authorization", "Bearer " + UserUtil.extractToken());
- HttpEntity entity = new HttpEntity<>(headers);
-
- try {
- ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, AppResponse.class);
- AppResponse response = responseEntity.getBody();
-
- if (response == null || response.getData() == null) {
- throw new ApplicationException("Error while getting sessions in month: response or data is null");
- }
-
- System.out.println("Access Given "+studentEmail+" for following video ids(UUID) "+response.getData());
-
-
-
- } catch (HttpClientErrorException.Forbidden e) {
- throw new ApplicationException("Access is forbidden: " + e.getMessage());
- } catch (HttpClientErrorException e) {
- throw new ApplicationException("Client error: " + e.getStatusCode() + " " + e.getMessage());
- } catch (Exception e) {
- throw new ApplicationException("Server error: " + e.getMessage());
- }
-
- }
-
private List findAllSessionsInMonth(UUID classId, int year, int month) throws ApplicationException {
String url = "http://lms-gateway/resource-management/session/get-all/in-month-and-class/" + classId + "/" + year + "/" + month;
HttpHeaders headers = new HttpHeaders();
diff --git a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
index c6d00fc..7abc635 100644
--- a/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
+++ b/payment-service/src/main/java/com/itgura/paymentservice/service/impl/PermissionServiceImpl.java
@@ -1,10 +1,8 @@
package com.itgura.paymentservice.service.impl;
-import com.itgura.dto.AppResponse;
import com.itgura.exception.ApplicationException;
import com.itgura.paymentservice.dto.request.hasPermissionRequest;
import com.itgura.paymentservice.dto.response.hasPermissionResponse;
-import com.itgura.paymentservice.entity.StudentTransactionContent;
import com.itgura.paymentservice.repository.StudentTransactionContentRepository;
import com.itgura.paymentservice.service.PermissionService;
import com.itgura.util.UserUtil;
@@ -12,18 +10,16 @@
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Service;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static com.fasterxml.jackson.databind.type.LogicalType.Map;
@Service
public class PermissionServiceImpl implements PermissionService {
@@ -35,9 +31,6 @@ public class PermissionServiceImpl implements PermissionService {
@Autowired
private StudentTransactionContentRepository studentTransactionContentRepository;
-
-
-
@Override
public List hasPermission(hasPermissionRequest data) throws ApplicationException {
@@ -65,8 +58,7 @@ public List hasPermission(hasPermissionRequest data) thro
if (authorities.contains("ADMIN") || authorities.contains("TEACHER")) {
response.add(new hasPermissionResponse(contentId, true));
} else if (authorities.contains("STUDENT")) {
-// response.add(new hasPermissionResponse(contentId, (studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)|| hasPermissionForRelevantSession(email,contentId))));
- response.add(new hasPermissionResponse(contentId, (studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)))); // only checking has access to particular session - If it has access to session all the content can access in it
+ response.add(new hasPermissionResponse(contentId, studentTransactionContentRepository.existsByStudentIdAndContentId(email, contentId)));
} else {
response.add(new hasPermissionResponse(contentId, false));
}
@@ -85,46 +77,4 @@ public List hasPermission(hasPermissionRequest data) thro
return null;
}
-
- @Override
- public List getEmailsHasAccessToSession(String sessionId) {
- List emails = new ArrayList<>();
- List studentTransactionContents = studentTransactionContentRepository.findByContentId(UUID.fromString(sessionId));
- if(!studentTransactionContents.isEmpty()) {
-
- for (StudentTransactionContent studentTransactionContent : studentTransactionContents) {
- emails.add(studentTransactionContent.getStudentEmail());
- }
- }
- return emails;
- }
-
-
-// private boolean hasPermissionForRelevantSession(String email, UUID contentId) throws ApplicationException {
-// //get session id for relevant content id
-// String url = "http://lms-gateway/resource-management/resource-management/session/getSessionIdByContentId/"+contentId;
-// HttpHeaders headers = new HttpHeaders();
-// headers.add("Authorization", "Bearer " + UserUtil.extractToken());
-// HttpEntity entity = new HttpEntity<>(headers);
-//
-// try {
-// ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, AppResponse.class);
-// AppResponse response = responseEntity.getBody();
-//
-// if (response == null || response.getData() == null) {
-// throw new ApplicationException("Error while getting sessions in month: response or data is null");
-// }
-//
-// System.out.println("Sessions for Month "+response.getData());
-//
-// return (List) response.getData();
-//
-// } catch (HttpClientErrorException.Forbidden e) {
-// throw new ApplicationException("Access is forbidden: " + e.getMessage());
-// } catch (HttpClientErrorException e) {
-// throw new ApplicationException("Client error: " + e.getStatusCode() + " " + e.getMessage());
-// } catch (Exception e) {
-// throw new ApplicationException("Server error: " + e.getMessage());
-// }
-// }
}
diff --git a/pom.xml b/pom.xml
index 22b48d3..b2fabfb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
auth-service
dms-mediator
payment-service
- youtube-permission-manager
+ quiz-management
diff --git a/youtube-permission-manager/pom.xml b/quiz-management/pom.xml
similarity index 75%
rename from youtube-permission-manager/pom.xml
rename to quiz-management/pom.xml
index ea1a553..a467eb1 100644
--- a/youtube-permission-manager/pom.xml
+++ b/quiz-management/pom.xml
@@ -1,33 +1,30 @@
-
+
4.0.0
com.itgura.lms
lms
1.0.0
-
- youtube-permission-manager
+
pom
+ quiz-management
+
- youtube-permission-manager-all
- youtube-permission-manager-dao
- youtube-permission-manager-service
+ quiz-management-all
+ quiz-management-dao
+ quiz-management-service
1.0.0
-
-
-
-
-
17
2023.0.1
+
+
org.springframework.cloud
@@ -37,13 +34,6 @@
org.springframework.boot
spring-boot-starter-web
-
- com.itgura.lms
- lib-common
- 0.0.1
- compile
-
-
@@ -73,4 +63,6 @@
-
\ No newline at end of file
+
+
+
diff --git a/youtube-permission-manager/youtube-permission-manager-all/pom.xml b/quiz-management/quiz-management-all/pom.xml
similarity index 75%
rename from youtube-permission-manager/youtube-permission-manager-all/pom.xml
rename to quiz-management/quiz-management-all/pom.xml
index 4ce343b..79c354b 100644
--- a/youtube-permission-manager/youtube-permission-manager-all/pom.xml
+++ b/quiz-management/quiz-management-all/pom.xml
@@ -1,14 +1,16 @@
-
+
+
4.0.0
- youtube-permission-manager
com.itgura.lms
+ quiz-management
1.0.0
- jar
- youtube-permission-manager-all
+ jar
+ quiz-management-all
build-docker-image
@@ -30,16 +32,17 @@
-
com.itgura.lms
- youtube-permission-manager-service
+ quiz-management-service
1.0.0
compile
-
-
+
+ org.springframework.boot
+ spring-boot-starter-security
+
17
@@ -55,4 +58,6 @@
+
+
\ No newline at end of file
diff --git a/quiz-management/quiz-management-all/src/main/java/com/itgura/QuizMain.java b/quiz-management/quiz-management-all/src/main/java/com/itgura/QuizMain.java
new file mode 100644
index 0000000..9d40e1a
--- /dev/null
+++ b/quiz-management/quiz-management-all/src/main/java/com/itgura/QuizMain.java
@@ -0,0 +1,16 @@
+package com.itgura;
+
+import com.itgura.util.BootMain;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@EnableDiscoveryClient
+@SpringBootApplication
+public class QuizMain {
+ public static void main(String[] args) {
+
+ BootMain.main(args);
+ SpringApplication.run(QuizMain.class);
+ }
+}
diff --git a/quiz-management/quiz-management-all/src/main/java/com/itgura/config/SecurityConfig.java b/quiz-management/quiz-management-all/src/main/java/com/itgura/config/SecurityConfig.java
new file mode 100644
index 0000000..b8d7ee0
--- /dev/null
+++ b/quiz-management/quiz-management-all/src/main/java/com/itgura/config/SecurityConfig.java
@@ -0,0 +1,101 @@
+package com.itgura.config;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity(prePostEnabled = true)
+public class SecurityConfig {
+
+ @Value("${jwt.secretKey}")
+ private String SECRET_KEY;
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ http.csrf(AbstractHttpConfigurer::disable)
+ .authorizeHttpRequests(request -> request.requestMatchers(
+ "/v3/api-docs/**",
+ "/swagger-ui/**",
+ "/swagger-ui.html",
+ "/webjars/**",
+ "/api/v1/resource-management/public/sample")
+
+ .permitAll()
+ .anyRequest().authenticated())
+ .addFilterBefore(new JWTAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
+ return http.build();
+ }
+
+ class JWTAuthorizationFilter extends OncePerRequestFilter {
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+ String authorizationHeader = request.getHeader("Authorization");
+
+ if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
+ String token = authorizationHeader.substring(7);
+ Claims claims = Jwts.parser()
+ .setSigningKey(SECRET_KEY).build()// Use as a formality to parse without validation
+ .parseClaimsJws(token)
+ .getBody();
+
+ String username = claims.getSubject();
+ if (username != null) {
+ var authorities = extractAuthorities(claims); // Method to extract authorities from claims
+ UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, authorities);
+ authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+ }
+ }else {
+ System.out.println("Authorization header is null");
+ }
+ filterChain.doFilter(request, response);
+
+ }
+
+ private Collection extends GrantedAuthority> extractAuthorities(Claims claims) {
+ // Extract the roles claim as a list of maps
+ List