Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
</developers>
<modules>
<module>prescription-service</module>
<module>users-service</module>
</modules>
<scm>
<connection/>
Expand All @@ -42,10 +43,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand All @@ -54,10 +51,6 @@
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
Expand Down
87 changes: 87 additions & 0 deletions users-service/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.stackbytes</groupId>
<artifactId>mediva-backend</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

<groupId>org.example</groupId>
<artifactId>users-service</artifactId>

<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>de.svenkubiak</groupId>
<artifactId>jBCrypt</artifactId>
<version>0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version> <!-- or another compatible version -->
<scope>provided</scope>
</dependency>
<!-- Spring Security JWT -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.1.1.RELEASE</version>
</dependency>

<!-- Java JWT (jjwt) -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>

<!-- JAXB Runtime (for Java 9+ compatibility) -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>

<!-- Bouncy Castle PKCS library for key pair generation -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk15on</artifactId>
<version>1.70</version> <!-- Use the latest stable version -->
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version> <!-- Use the latest stable version -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
</project>
11 changes: 11 additions & 0 deletions users-service/src/main/java/com/stackbytes/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stackbytes;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.stackbytes.controllers;

import com.stackbytes.models.LoginData;
import com.stackbytes.models.RegisterRequestDto;
import com.stackbytes.models.ResponseJson;
import com.stackbytes.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.stackbytes.models.User;

@RestController()
@RequestMapping("/users")
public class UserController {
@Autowired
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@CrossOrigin
@PostMapping("/login")
public ResponseJson loginUser(@RequestBody LoginData loginData) {
return userService.loginUser(loginData);
}
@CrossOrigin
@PostMapping("/register")
public ResponseJson registerUser(@RequestBody RegisterRequestDto registerRequestDto) throws Exception{
return userService.registerUser(registerRequestDto);
}
@CrossOrigin
@GetMapping("/test")
public String test() throws Exception{
return userService.test();
}
}
13 changes: 13 additions & 0 deletions users-service/src/main/java/com/stackbytes/models/ContactInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;

@Builder
@Getter
@Data
public class ContactInfo {
private String phone;
private String email;
}
14 changes: 14 additions & 0 deletions users-service/src/main/java/com/stackbytes/models/LoginData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;

@Builder
@Getter
@Data
public class LoginData {
private String email;
private String password;
private boolean isMedic;
}
34 changes: 34 additions & 0 deletions users-service/src/main/java/com/stackbytes/models/Medic.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.util.Pair;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Document(collection = "medics")
@Data
@Builder
@Getter
public class Medic {
@Id
private String id;
private String medicalId;
private String password;
private Date activeSince;
private String speciality;
private String grade;
private Pair<String,String> gpg;
private String workPlace;
private double ratings;
private String bio;
private ContactInfo contactInfo;
private List<String> userId;
private Date createdAt;
private Date updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;

@Builder
@Getter
@Data
public class RegisterRequestDto {
private User user;
private Medic medic;
private boolean isMedic;
public boolean isMedic() {
return isMedic;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Getter;
import org.springframework.data.util.Pair;

import java.util.HashMap;

@Builder
@Getter
public class ResponseJson {
private int code;
private boolean status;
private String message;
private String token;
private Pair<String,String> gpg;
}
33 changes: 33 additions & 0 deletions users-service/src/main/java/com/stackbytes/models/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.stackbytes.models;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.scheduling.support.SimpleTriggerContext;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Document(collection = "users")
@Builder
@Getter
@Setter
@Data
public class User {
@Id
private String id;
private String username;
private String email;
private String password;
private String fullName;
private String phone;
private String avatar;
private Medic medic;
private List<String> doctorsId;
private Date createdAt;
private Date updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stackbytes.services;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.Security;

public class BouncyCastleSetup {
public static void setup() {
Security.addProvider(new BouncyCastleProvider());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.stackbytes.services;

import jakarta.annotation.PostConstruct;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.operator.PBESecretKeyEncryptor;
import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.PGPDigestCalculator;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;

import java.io.ByteArrayOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Date;

@Component
public class GPGKeyGenerator2 {
@Autowired
private GetProperties getProperties;
@PostConstruct
public void init() {
BouncyCastleSetup.setup();
}

public PGPKeyRingGenerator generateKey(String id) throws Exception{
String passphrase = getProperties.getProperties("gpg.passphrase");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair rsaKeyPair = keyPairGenerator.generateKeyPair();
PGPKeyPair pgpKeyPair = new JcaPGPKeyPair(PGPPublicKey.RSA_GENERAL, rsaKeyPair, new Date());
PGPDigestCalculator sha256Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(PGPUtil.SHA1);
PBESecretKeyEncryptor keyEncryptor = new JcePBESecretKeyEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256, sha256Calc)
.setProvider("BC")
.build(passphrase.toCharArray());
PGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder(pgpKeyPair.getPublicKey().getAlgorithm(), PGPUtil.SHA1)
.setProvider("BC");
return new PGPKeyRingGenerator(
PGPSignature.POSITIVE_CERTIFICATION,
pgpKeyPair,
id,
sha256Calc,
null,
null,
contentSignerBuilder,
keyEncryptor
);
}
public byte[] getPublicKeyBytes(PGPKeyRingGenerator keyRingGenerator) throws Exception {
PGPPublicKeyRing publicKeyRing = keyRingGenerator.generatePublicKeyRing();
ByteArrayOutputStream out = new ByteArrayOutputStream();
publicKeyRing.encode(out);
return out.toByteArray();
}
public byte[] getPrivateKeyBytes(PGPKeyRingGenerator keyRingGenerator) throws Exception {
PGPSecretKeyRing secretKeyRing = keyRingGenerator.generateSecretKeyRing();
ByteArrayOutputStream out = new ByteArrayOutputStream();
secretKeyRing.encode(out);
return out.toByteArray();
}
}
Loading