Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

48 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bytesblogs: Bloging Platform

BytesBlogs is a high-performance, full-stack blogging application tailored for developers. It features a modern React Single Page Application (SPA) frontend and a secure, robust Spring Boot backend. Authors can write posts in Markdown with live syntax highlighting, organize content via categories and tags, upload images to Cloudinary, sign in with Google OAuth2 or OTP-verified email verification, and administrators can manage users and posts using a sleek analytics-enabled dashboard.


Java 25Spring Boot 4.0.6React 19ViteTailwindCSSDocker


Table of Contents

  1. Key Features
  2. Architecture Overview
  3. Technology Stack
  4. Project Directory Map
  5. Local Development Setup
  6. Environment Configurations
  7. Dockerization Guide
  8. Unified Production Build (Topology A)
  9. Postman Integration Testing

Key Features

  • Secure Sessions & Auth: JWT authentication utilizing secure, stateless HTTP-Only cookies for robust cross-site scripting (XSS) and cross-site request forgery (CSRF) protection.
  • OTP & OAuth2 Sign-In: Supports single-click Google Sign-In as well as password-less logins via secure OTP (One-Time Password) codes sent straight to the user's inbox.
  • Markdown Editor: Real-time parsed Markdown view enabling developers to write technical posts with instant preview and syntax highlighting for major programming languages.
  • Cloud Storage: Seamless media upload handling directly integrated with Cloudinary for fast CDN-driven image delivery.
  • Admin Console: Access statistical oversight graphs (users growth, category counts, top stories) and role control centers to manage post moderation and users accounts.
  • Interactions: Built-in views, likes, and comment threads for maximum community engagement.

Architecture Overview

The following diagram illustrates the network flow and service communication:

graph TD
Client[React SPA Client - Vite] <-->|HTTP / CORS / JWT| API[Spring Boot REST API]
API <-->|Spring Security / Filter Chain| Auth[JWT & OAuth2 Client]
API <-->|Spring Data JPA| DB[(MySQL Database)]
API --->|SMTP Protocol| Email[Brevo / SMTP Service]
API --->|Cloudinary API| Cloud[Cloudinary Image Storage]
Loading

Technology Stack

Backend Technologies

ComponentTechnologyDescription
LanguageJavaCore application runtime environment (Java 25)
FrameworkSpring BootCore REST API backend architecture (v4.0.6)
SecuritySpring SecurityStateless authentication using JWT cookies & Google OAuth2
DatabaseMySQLMain relational database management system
ORMHibernateData access layer, entity mappings and query parsing
Build SystemMavenProject dependencies compilation and builder
Cloud CDNCloudinaryDistributed media upload hosting API
Mail DispatcherBrevoSMTP mailing engine for verification OTP dispatch

Frontend Technologies

ComponentTechnologyDescription
SPA LibraryReactComponent-driven user interface rendering (v19)
Build EngineViteBundler & high-speed development server (v8)
Style SheetTailwind CSSUtility-first responsive spacing layout guidelines (v3.4)
ComponentsRadix UIUnstyled accessible dropdowns, dialogs, and panels

Project Directory Map

├── frontend/ # React Frontend Application
│ ├── public/ # Static assets & favicons
│ ├── src/
│ │ ├── components/ # UI components (Header, Footer, LogoBug)
│ │ ├── context/ # React contexts (Auth, Theme)
│ │ ├── pages/ # Page views (Auth, BlogDetail, Admin Console)
│ │ ├── services/ # HTTP client APIs
│ │ └── App.jsx # Routing and modal coordination
│ ├── tailwind.config.js # Styles design token configuration
│ └── package.json # Frontend dependency manifest
│
└── spring-backend/ # Spring Boot Backend REST Service
├── src/main/java/com/blogapp/
│ ├── controller/ # REST Controllers (Auth, Blogs, Comments)
│ ├── dto/ # Request & Response Data Objects (DTOs)
│ ├── model/ # JPA Entity Definitions
│ ├── repository/ # Spring Data JPA Repository interfaces
│ ├── security/ # Spring Security, JWT validation filters
│ └── service/ # Logic implementations
├── src/main/resources/
│ ├── application.yaml # Main environment configurations
│ └── application-dev.yaml # Dev configurations (with environment overrides)
├── Dockerfile # Multi-stage containerization build file
├── postman_collection.json # Integrated API testing collection
└── pom.xml # Maven build dependencies config

Local Development Setup

Prerequisite Checklist

  • Java: JDK 25 installed
  • NodeJS: Version 18 or higher (along with npm)
  • Database: MySQL Server instance running locally

Running the Backend

  1. Create a MySQL database instance named blog_db:
    CREATEDATABASEblog_db;
  2. Navigate to spring-backend/src/main/resources and configure your credentials inside application-dev.yaml.
  3. Start the Spring Boot application using the wrapper:
    cd spring-backend
    ./mvnw spring-boot:run

Running the Frontend

  1. Navigate to the frontend folder:
    cd frontend
  2. Install npm dependencies:
    npm install
  3. Start the Vite server:
    npm run dev
  4. Open your browser to http://localhost:5173. Vite is pre-configured to proxy API requests to your local backend on port 8080.

Environment Configurations

For deployments or container overrides, configure the variables listed below:

Variable NameDescriptionDefault / Example
PORTBackend server port8080
DB_URLMySQL Connection URLjdbc:mysql://localhost:3306/blog_db
DB_USERNAMEDatabase usernameroot
DB_PASSWORDDatabase passwordyour_mysql_password
JWT_SECRET256-bit Base64 JWT Secret KeyGenerate a secure random string
JWT_EXPIRATIONJWT token expiration time (in ms)86400000 (1 day)
GOOGLE_CLIENT_IDGoogle Console OAuth Client IDyour-google-client-id
GOOGLE_CLIENT_SECRETGoogle Console OAuth Client Secretyour-google-client-secret
GOOGLE_REDIRECT_URIGoogle OAuth redirect URI overridehttp://localhost:8080/login/oauth2/code/google
MAIL_HOSTSMTP Server Host Addresssmtp.gmail.com or Brevo SMTP
MAIL_PORTSMTP Server Connection Port587
MAIL_USERNAMEMailer account usernameexample@gmail.com
MAIL_PASSWORDMailer account SMTP password / app passwordyour-app-password
MAIL_FROMOrigin mail address for notificationsno-reply@bytesblogs.com
CLOUDINARY_CLOUD_NAMECloudinary Account Cloud Nameyour-cloud-name
CLOUDINARY_API_KEYCloudinary API Keyyour-api-key
CLOUDINARY_API_SECRETCloudinary API Secret Keyyour-api-secret
FRONTEND_URLFrontend client origin (CORS/Redirects)http://localhost:5173

Dockerization Guide

1. Build the Docker Image

Navigate to your spring-backend directory and compile the multi-stage image:

cd spring-backend
docker build -t blog-backend:latest .

2. Run in Docker Desktop GUI

  1. Open Docker Desktop and navigate to the Images tab.
  2. Find blog-backend:latest and click the blue Run button.
  3. Click on Optional settings to configure variables:
    • Container Name:blog-backend-container
    • Ports: Map Host Port 8080 to Container Port 8080.
    • Environment Variables: Click the + (Add) button to supply:
      • DB_URL ➡️ jdbc:mysql://host.docker.internal:3306/blog_db
      • DB_USERNAME ➡️ root
      • DB_PASSWORD ➡️ your_mysql_password
  4. Click Run. The app will launch and securely connect to the host MySQL database using the host.docker.internal gateway loop.

Unified Production Build (Topology A)

For ease of hosting, compile the frontend assets directly inside the JAR to serve the app on a single unified port:

  1. Navigate to the frontend folder and build the assets:
    cd frontend && npm run build
  2. Move static files to the Spring static resource directory:
    cp -r dist/* ../spring-backend/src/main/resources/static/
  3. Compile the package JAR:
    cd ../spring-backend
    ./mvnw clean package -DskipTests
  4. Execute the JAR:
    java -jar target/spring-backend-0.0.1-SNAPSHOT.jar
    Your site will be fully accessible at http://localhost:8080.

Postman Integration Testing

To test the API endpoints independently:

  1. Locate postman_collection.json in the spring-backend directory.
  2. Import it into Postman.
  3. Set the baseUrl variable to http://localhost:8080.
  4. Run requests under the Auth folder (e.g. Register, Login, OTP confirmation) to verify JWT generation and stateless cookie authorization.

About

Secure full-stack developer blogging platform API built with Spring Boot (Java 25), Spring Security, OAuth2, and MySQL.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages