How laithanhmai334/b2b-carton-selling-website-backend works
Purpose and Runtime
This is a Maven-based Java/Spring Boot backend for a B2B carton-selling and contracting workflow. It exposes REST APIs for company onboarding and verification, user access, document/certificate handling, contract negotiation and signing, order forms, pricing, and payments. The runtime starts at src/main/java/com/nhanguyen/b2bcarton/B2bcartonApplication.java; environment configuration is under src/main/resources/application.yaml and src/main/resources/application.properties.
HTTP API and Application Boundary
Controllers are the inbound REST boundary, translating request DTOs into service calls and response DTOs. Major API domains include companies and verification, contracts, invitations, users/permissions, and AI:
• src/main/java/com/nhanguyen/b2bcarton/controller/CompanyController.java
• src/main/java/com/nhanguyen/b2bcarton/controller/ContractController.java
• src/main/java/com/nhanguyen/b2bcarton/controller/AIController.java
DTO packages separate API payloads from persistence entities, with ApiResponse providing a common response envelope.
Identity, JWT, and Authorization
Authentication/token lifecycle is handled by authentication services and token entities; invalidated tokens are persisted for revocation. Spring Security is configured with a custom JWT decoder and authentication entry point. Fine-grained authorization is an AOP permission check via annotation/aspect, beyond endpoint authentication.
• src/main/java/com/nhanguyen/b2bcarton/configuration/SecurityConfig.java
• src/main/java/com/nhanguyen/b2bcarton/service/AuthService.java
• src/main/java/com/nhanguyen/b2bcarton/security/aspect/PermissionAspect.java
Control flow: request → security/JWT validation → controller → permission aspect where annotated → domain service.
Company Onboarding, Trust, and Documents
Company registration establishes company/user-related records, then verification combines tax-code validation, email-domain checks, uploaded documents, and certificates. Company, certificate, and document entities persist status-driven workflows; services isolate validation, storage, and verification decisions.
• src/main/java/com/nhanguyen/b2bcarton/service/RegisterCompanyService.java
• src/main/java/com/nhanguyen/b2bcarton/service/CompanyVerificationService.java
• src/main/java/com/nhanguyen/b2bcarton/entity/CompanyDocument.java
Document processing additionally crosses external-service boundaries through storage, OCR, and certificate management.
Commercial Contract Lifecycle
The core transaction model spans contract requests, negotiation messages, contracts and terms, MSAs, and order forms. Policy, pricing, PDF generation, and digital signatures are explicit domain services, indicating a staged flow from request/negotiation to agreement generation, signing, and order execution.
• src/main/java/com/nhanguyen/b2bcarton/service/ContractRequestService.java
• src/main/java/com/nhanguyen/b2bcarton/service/ContractService.java
• src/main/java/com/nhanguyen/b2bcarton/service/DigitalSignatureService.java
Key persisted state is represented by ContractRequest, NegotiationMessage, Contract, MSA, and OrderForm entities.
Persistence and Domain State
Spring Data-style repository interfaces are the persistence boundary for the relational domain model. Entities encode lifecycle states through enums such as company, document, certificate, contract-request, contract, MSA, and order-form statuses.
• src/main/java/com/nhanguyen/b2bcarton/repository/CompanyRepository.java
• src/main/java/com/nhanguyen/b2bcarton/repository/ContractRepository.java
• src/main/java/com/nhanguyen/b2bcarton/entity/Invoice.java
Services generally own repository interaction; mappers mediate entity-to-response transformations.
External Integrations and Background Work
Infrastructure-facing services include Cloudinary-backed file storage configuration, HTTP calls through RestTemplate, mail delivery, payment/VietQR generation, OCR, AI, tax-code verification, encryption, and PDF/signature operations.
• src/main/java/com/nhanguyen/b2bcarton/configuration/CloudinaryConfig.java
• src/main/java/com/nhanguyen/b2bcarton/configuration/RestTemplateConfig.java
• src/main/java/com/nhanguyen/b2bcarton/service/PaymentService.java
A scheduled tier recalculation process updates customer-tier-related state independently of request handling:
src/main/java/com/nhanguyen/b2bcarton/scheduler/TierRecalculationJob.java.
Components 18
API & Security
- Spring Boot runtime · Application entry point and runtime bootstrap.
src/main/java/com/nhanguyen/b2bcarton/B2bcartonApplication.java - REST controllers · Company, contract, and AI request boundary.
src/main/java/com/nhanguyen/b2bcarton/controller/CompanyController.java - DTOs & API envelope · Separates request and response payloads from entities.
- JWT security · Authenticates requests with custom JWT handling.
src/main/java/com/nhanguyen/b2bcarton/configuration/SecurityConfig.java - Permission aspect · Applies fine-grained annotated permission checks.
src/main/java/com/nhanguyen/b2bcarton/security/aspect/PermissionAspect.java - Authentication service · Manages token lifecycle and revocation.
src/main/java/com/nhanguyen/b2bcarton/service/AuthService.java
Onboarding & Trust
- Company registration · Establishes company and related user records.
src/main/java/com/nhanguyen/b2bcarton/service/RegisterCompanyService.java - Company verification · Combines tax, email-domain, document, and certificate checks.
src/main/java/com/nhanguyen/b2bcarton/service/CompanyVerificationService.java - Company documents · Status-driven uploaded-document state.
src/main/java/com/nhanguyen/b2bcarton/entity/CompanyDocument.java
Contract Commerce
- Contract requests & negotiation · Starts requests and negotiation-message workflow.
src/main/java/com/nhanguyen/b2bcarton/service/ContractRequestService.java - Contract lifecycle · Manages contracts, terms, MSAs, and order forms.
src/main/java/com/nhanguyen/b2bcarton/service/ContractService.java - Digital signatures · Signs generated commercial agreements.
src/main/java/com/nhanguyen/b2bcarton/service/DigitalSignatureService.java
Persistence & Integrations
- Payments & VietQR · Generates payment flows for commercial transactions.
src/main/java/com/nhanguyen/b2bcarton/service/PaymentService.java - Spring Data repositories · Repository interfaces used by domain services.
src/main/java/com/nhanguyen/b2bcarton/repository/CompanyRepository.java - Relational domain state · Lifecycle entities include contracts, MSAs, order forms, and invoices.
src/main/java/com/nhanguyen/b2bcarton/entity/Invoice.java - External service adapters · Storage, OCR, AI, tax verification, mail, PDF, and encryption.
src/main/java/com/nhanguyen/b2bcarton/configuration/RestTemplateConfig.java - Cloudinary storage · Stores uploaded company documents.
src/main/java/com/nhanguyen/b2bcarton/configuration/CloudinaryConfig.java - Tier recalculation job · Updates customer-tier state outside request handling.
src/main/java/com/nhanguyen/b2bcarton/scheduler/TierRecalculationJob.java
Connections 20
- Spring Boot runtime → JWT security: boots
- JWT security → REST controllers: validates JWT before
- REST controllers → DTOs & API envelope: maps payloads
- REST controllers → Permission aspect: invokes annotated checks
- Permission aspect → Authentication service: uses identity context
- REST controllers → Company registration: onboarding APIs
- REST controllers → Company verification: verification APIs
- Company registration → Spring Data repositories: persists records
- Company verification → Company documents: evaluates
- Company verification → Cloudinary storage: stores uploads
- Company verification → External service adapters: uses OCR and tax checks
- REST controllers → Contract requests & negotiation: request APIs
- Contract requests & negotiation → Contract lifecycle: negotiation to agreement
- Contract lifecycle → Digital signatures: sends agreements
- Contract lifecycle → Payments & VietQR: drives order payment
- Contract requests & negotiation → Spring Data repositories: persists workflow
- Contract lifecycle → Spring Data repositories: persists lifecycle
- Spring Data repositories → Relational domain state: reads and writes
- Authentication service → Spring Data repositories: stores revoked tokens
- Tier recalculation job → Spring Data repositories: updates tier state