Fernando 1 сар өмнө
parent
commit
c00275146d

+ 83 - 5
routes.md

@@ -37,8 +37,16 @@ POST {{baseUrl}}/auth/register/default
 ```
 ```
 - email = "tester@tooeasy.local" 
 - email = "tester@tooeasy.local" 
 - password = "ChangeMe123!"
 - password = "ChangeMe123!"
+- Response 201 Created:
+```json
+{
+  "token": "<JWT>",
+  "companyId": 1,
+  "userId": 1
+}
+```
 
 
-## POST {{baseUrl}}/auth/register
+#### POST {{baseUrl}}/auth/register
 - Body (application/json) — fields from `RegisterDTO` (`src/main/java/com/platform2easy/genesis/web/dto/RegisterDTO.java`):
 - Body (application/json) — fields from `RegisterDTO` (`src/main/java/com/platform2easy/genesis/web/dto/RegisterDTO.java`):
 ```json
 ```json
 {
 {
@@ -61,9 +69,13 @@ POST {{baseUrl}}/auth/register/default
 ```
 ```
 - Response 201 Created:
 - Response 201 Created:
 ```json
 ```json
-{ "token": "<JWT>" }
+{
+  "token": "<JWT>",
+  "companyId": 1,
+  "userId": 1
+}
 ```
 ```
-## Login
+
 #### POST {{baseUrl}}/auth/login
 #### POST {{baseUrl}}/auth/login
 - Body — `AuthenticationDTO` (`src/main/java/com/platform2easy/genesis/web/dto/AuthenticationDTO.java`):
 - Body — `AuthenticationDTO` (`src/main/java/com/platform2easy/genesis/web/dto/AuthenticationDTO.java`):
 ```json
 ```json
@@ -71,8 +83,65 @@ POST {{baseUrl}}/auth/register/default
 ```
 ```
 - Response 200 OK:
 - Response 200 OK:
 ```json
 ```json
-{ "token": "<JWT>" }
+{
+  "token": "<JWT>",
+  "companyId": 1,
+  "userId": 1
+}
+```
+
+#### POST {{baseUrl}}/auth/validate-token
+- Headers:
+  - Authorization: Bearer <JWT>
+- Response 200 OK (if token is valid):
+```json
+{
+  "token": "<JWT>",
+  "companyId": 1,
+  "userId": 1
+}
+```
+- Response 401 Unauthorized (if token is invalid or expired)
+
+## User Management
+
+#### GET {{baseUrl}}/auth/company/{companyId}
+- Headers:
+  - Authorization: Bearer <JWT>
+- Path params: companyId (Integer)
+- Response 200 OK: List of users from the specified company
+
+#### PUT {{baseUrl}}/auth/email/{id}
+- Headers:
+  - Authorization: Bearer <JWT>
+  - Content-Type: application/json
+- Path params: id (Long) - User ID
+- Request body:
+```json
+{
+  "userEmail": "new.email@example.com"
+}
+```
+- Response 200 OK: Updated user object
+
+#### PUT {{baseUrl}}/auth/password/{id}
+- Headers:
+  - Authorization: Bearer <JWT>
+  - Content-Type: application/json
+- Path params: id (Long) - User ID
+- Request body:
+```json
+{
+  "userPassword": "newSecurePassword123"
+}
 ```
 ```
+- Response 200 OK: Updated user object with hashed password
+
+#### DELETE {{baseUrl}}/auth/{id}
+- Headers:
+  - Authorization: Bearer <JWT>
+- Path params: id (Long) - User ID to delete
+- Response 204 No Content (on successful deletion)
 
 
 ## Commodity API (`com.platform2easy.genesis.web.controller.CommodityController`)
 ## Commodity API (`com.platform2easy.genesis.web.controller.CommodityController`)
 #### Base path: {{baseUrl}}/api/commodity
 #### Base path: {{baseUrl}}/api/commodity
@@ -107,7 +176,7 @@ Notes:
   - List all orderbook entries.
   - List all orderbook entries.
 
 
 - GET {{baseUrl}}/api/orderbook?isToken=0|1
 - GET {{baseUrl}}/api/orderbook?isToken=0|1
-  - Query params: `isToken` (0 or 1). Filters by `orderbook_is_token` (1=true, 0=false).
+  - Query params: `isToken` (0 or 1). Filters by `orderbook_is_token` (1 = true = sell, 0 = false = buy).
 
 
 - GET {{baseUrl}}/api/orderbook/{id}
 - GET {{baseUrl}}/api/orderbook/{id}
   - Path params: id (Long)
   - Path params: id (Long)
@@ -153,6 +222,15 @@ Notes:
   "name": "Minha Empresa",
   "name": "Minha Empresa",
   "flag": "ACTIVE"
   "flag": "ACTIVE"
 }
 }
+
+```
+- Response 201 Created:
+```json
+{
+  "id": 1,
+  "name": "Minha Empresa",
+  "flag": "ACTIVE"
+}
 ```
 ```
 
 
 - PUT {{baseUrl}}/api/company/{id}
 - PUT {{baseUrl}}/api/company/{id}

+ 13 - 0
src/main/java/com/platform2easy/genesis/infra/security/TokenService.java

@@ -35,4 +35,17 @@ public class TokenService {
                 .verify(token);
                 .verify(token);
         return decoded.getSubject();
         return decoded.getSubject();
     }
     }
+    
+    public boolean validateToken(String token) {
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWT.require(algorithm)
+                .withIssuer("genesis")
+                .build()
+                .verify(token);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
 }
 }

+ 32 - 3
src/main/java/com/platform2easy/genesis/web/controller/AuthenticationController.java

@@ -56,7 +56,7 @@ public class AuthenticationController {
         user.setUserFlag(dto.getFlag());
         user.setUserFlag(dto.getFlag());
         AppUser saved = appUserRepository.save(user);
         AppUser saved = appUserRepository.save(user);
         String token = tokenService.generateToken(saved);
         String token = tokenService.generateToken(saved);
-        return ResponseEntity.status(HttpStatus.CREATED).body(new TokenDTO(token));
+        return ResponseEntity.status(HttpStatus.CREATED).body(new TokenDTO(token, saved.getCompanyId()));
     }
     }
 
 
     @PostMapping("/login")
     @PostMapping("/login")
@@ -70,7 +70,7 @@ public class AuthenticationController {
             return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
             return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
         }
         }
         String token = tokenService.generateToken(user);
         String token = tokenService.generateToken(user);
-        return ResponseEntity.ok(new TokenDTO(token));
+        return ResponseEntity.ok(new TokenDTO(token, user.getCompanyId()));
     }
     }
 
 
     @PostMapping("/register/default")
     @PostMapping("/register/default")
@@ -105,7 +105,7 @@ public class AuthenticationController {
             status = HttpStatus.CREATED;
             status = HttpStatus.CREATED;
         }
         }
         String token = tokenService.generateToken(user);
         String token = tokenService.generateToken(user);
-        return ResponseEntity.status(status).body(new TokenDTO(token));
+        return ResponseEntity.status(status).body(new TokenDTO(token, user.getCompanyId()));
     }
     }
 
 
     // GET /auth/company/{companyId}: Lista todos os usuários de uma empresa
     // GET /auth/company/{companyId}: Lista todos os usuários de uma empresa
@@ -139,4 +139,33 @@ public class AuthenticationController {
     public void delete(@PathVariable Long id) {
     public void delete(@PathVariable Long id) {
         service.deletarPorId(id);
         service.deletarPorId(id);
     }
     }
+    
+    @PostMapping("/validate-token")
+    public ResponseEntity<TokenDTO> validateToken(@RequestHeader("Authorization") String authHeader) {
+        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
+        }
+        
+        String token = authHeader.substring(7);
+        try {
+            // First validate the token
+            if (!tokenService.validateToken(token)) {
+                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
+            }
+            
+            // If token is valid, get the username from the token
+            String username = tokenService.getSubject(token);
+            Optional<AppUser> userOpt = appUserRepository.findByUserEmail(username);
+            
+            if (userOpt.isEmpty()) {
+                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
+            }
+            
+            AppUser user = userOpt.get();
+            return ResponseEntity.ok(new TokenDTO(token, user.getCompanyId(), user.getUserId()));
+            
+        } catch (Exception e) {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
+        }
+    }
 }
 }

+ 6 - 3
src/main/java/com/platform2easy/genesis/web/controller/CompanyController.java

@@ -3,11 +3,14 @@ package com.platform2easy.genesis.web.controller;
 import com.platform2easy.genesis.domain.model.Company;
 import com.platform2easy.genesis.domain.model.Company;
 import com.platform2easy.genesis.domain.service.CompanyService;
 import com.platform2easy.genesis.domain.service.CompanyService;
 import com.platform2easy.genesis.web.dto.CompanyWithUserDTO;
 import com.platform2easy.genesis.web.dto.CompanyWithUserDTO;
+import com.platform2easy.genesis.web.dto.CompanyResponseDTO;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 @RequestMapping("/api/company")
 @RequestMapping("/api/company")
@@ -29,10 +32,10 @@ public class CompanyController {
     }
     }
 
 
     @PostMapping
     @PostMapping
-    @ResponseStatus(HttpStatus.CREATED)
-    public Company create(@RequestBody Company company) {
+    public ResponseEntity<CompanyResponseDTO> create(@RequestBody Company company) {
         company.setId(null);
         company.setId(null);
-        return service.salvar(company);
+        Company savedCompany = service.salvar(company);
+        return ResponseEntity.status(HttpStatus.CREATED).body(CompanyResponseDTO.fromEntity(savedCompany));
     }
     }
 
 
     @PutMapping("/{id}")
     @PutMapping("/{id}")

+ 26 - 0
src/main/java/com/platform2easy/genesis/web/dto/CompanyResponseDTO.java

@@ -0,0 +1,26 @@
+package com.platform2easy.genesis.web.dto;
+
+import com.platform2easy.genesis.domain.model.Company;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CompanyResponseDTO {
+    private Long id;
+    private String companyName;
+    private String companyFlag;
+
+    public static CompanyResponseDTO fromEntity(Company company) {
+        if (company == null) {
+            return null;
+        }
+        return new CompanyResponseDTO(
+            company.getId(),
+            company.getName(),
+            company.getFlag()
+        );
+    }
+}

+ 18 - 3
src/main/java/com/platform2easy/genesis/web/dto/TokenDTO.java

@@ -1,6 +1,5 @@
 package com.platform2easy.genesis.web.dto;
 package com.platform2easy.genesis.web.dto;
 
 
-import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 import lombok.Setter;
@@ -8,7 +7,23 @@ import lombok.Setter;
 @Getter
 @Getter
 @Setter
 @Setter
 @NoArgsConstructor
 @NoArgsConstructor
-@AllArgsConstructor
 public class TokenDTO {
 public class TokenDTO {
     private String token;
     private String token;
-}
+    private Integer companyId;
+    private Long userId;
+    
+    public TokenDTO(String token) {
+        this.token = token;
+    }
+    
+    public TokenDTO(String token, Integer companyId) {
+        this.token = token;
+        this.companyId = companyId;
+    }
+    
+    public TokenDTO(String token, Integer companyId, Long userId) {
+        this.token = token;
+        this.companyId = companyId;
+        this.userId = userId;
+    }
+}

+ 1 - 1
src/main/resources/application-postgres.properties

@@ -1,6 +1,6 @@
 spring.application.name=genesis
 spring.application.name=genesis
 
 
-server.port=8080
+server.port=${SERVER_PORT:8081}
 
 
 api.security.token.secret=${JWT_SECRET:my-secret-key}
 api.security.token.secret=${JWT_SECRET:my-secret-key}
 
 

+ 1 - 2
src/main/resources/application.properties

@@ -1,7 +1,6 @@
 spring.application.name=genesis
 spring.application.name=genesis
 
 
-server.port=8080
-
+server.port=${SERVER_PORT:8081}
 server.error.whitelabel.enabled=false
 server.error.whitelabel.enabled=false
 server.error.include-message=never
 server.error.include-message=never