Event Categories Management API

Author: Josh S. Sakweli, Backend Lead Team
Last Updated: 2025-12-11
Version: v1.0

Base URL: https://api.nexgate.com/api/v1

Short Description: The Event Categories Management API provides administrative functionality for managing event categories in the Nexgate platform. This API enables authorized users (Staff Admin/Super Admin) to create, update, retrieve event categories, and seed default categories for event classification and organization.

Hints:


Standard Response Format

All API responses follow a consistent structure using our Globe Response Builder pattern:

Success Response Structure

{
  "success": true,
  "httpStatus": "OK",
  "message": "Operation completed successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    // Actual response data goes here
  }
}

Error Response Structure

{
  "success": false,
  "httpStatus": "BAD_REQUEST",
  "message": "Error description",
  "action_time": "2025-12-11T10:30:45",
  "data": "Error description"
}

Standard Response Fields

Field Type Description
success boolean Always true for successful operations, false for errors
httpStatus string HTTP status name (OK, BAD_REQUEST, NOT_FOUND, etc.)
message string Human-readable message describing the operation result
action_time string ISO 8601 timestamp of when the response was generated
data object/string Response payload for success, error details for failures

HTTP Method Badge Standards

For better visual clarity, all endpoints use colored badges for HTTP methods with the following standard colors:


EventCategoryResponse Structure

This is the standard response structure returned by all category endpoints:

{
  "categoryId": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Music & Concerts",
  "slug": "music-concerts",
  "description": "Live music performances, concerts, festivals, and DJ events",
  "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
  "colorCode": "#E91E63",
  "isActive": true,
  "isFeatured": true,
  "eventCount": 125,
  "createdBy": "admin_user",
  "createdAt": "2025-12-11T10:30:45",
  "updatedBy": "admin_user",
  "updatedAt": "2025-12-11T14:20:30"
}

Response Field Descriptions

Field Type Description
categoryId string (UUID) Unique identifier for the category
name string Category display name (unique, case-insensitive)
slug string URL-friendly identifier (auto-generated, unique)
description string Category description
iconUrl string URL or path to category icon image
colorCode string Hex color code for category theming (#RRGGBB or #RGB)
isActive boolean Whether category is active and visible
isFeatured boolean Whether category should be featured/highlighted
eventCount integer Number of events in this category
createdBy string Username of the admin who created the category
createdAt string ISO 8601 timestamp of creation
updatedBy string Username of the admin who last updated (null if never updated)
updatedAt string ISO 8601 timestamp of last update (null if never updated)

Endpoints

1. Create Category

Purpose: Create a new event category (requires admin privileges)

Endpoint: POST {base_url}/e-events/categories

Access Level: 🔒 Protected (Requires Bearer Token Authentication + Admin Role)

Required Roles: ROLE_STAFF_ADMIN or ROLE_SUPER_ADMIN

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Request JSON Sample:

{
  "name": "Music & Concerts",
  "description": "Live music performances, concerts, festivals, and DJ events",
  "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
  "colorCode": "#E91E63",
  "isActive": true,
  "isFeatured": true
}

Request Body Parameters:

Parameter Type Required Description Validation
name string Yes Category name Min: 2, Max: 100 characters
description string No Category description Max: 500 characters
iconUrl string No URL or path to icon image Must be valid image URL (jpg, jpeg, png, gif, svg, webp) or path starting with /icons/
colorCode string No Hex color code Must be valid hex format: #RRGGBB or #RGB (e.g., #FF5733 or #F57)
isActive boolean Yes Whether category is active Required boolean value
isFeatured boolean Yes Whether category is featured Required boolean value

Success Response: Returns standard EventCategoryResponse structure (see "EventCategoryResponse Structure" section above)

Success Response Message: "Category created successfully"

Success Response JSON Sample:

{
  "success": true,
  "httpStatus": "OK",
  "message": "Category created successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "categoryId": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Music & Concerts",
    "slug": "music-concerts",
    "description": "Live music performances, concerts, festivals, and DJ events",
    "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
    "colorCode": "#E91E63",
    "isActive": true,
    "isFeatured": true,
    "eventCount": 0,
    "createdBy": "admin_user",
    "createdAt": "2025-12-11T10:30:45",
    "updatedBy": null,
    "updatedAt": null
  }
}

Standard Error Types:

Application-Level Exceptions (400-499)

Error Response Examples:

Already Exists - Duplicate Name (400):

{
  "success": false,
  "httpStatus": "BAD_REQUEST",
  "message": "Category already exists",
  "action_time": "2025-12-11T10:30:45",
  "data": "Category with name 'Music & Concerts' already exists"
}

Access Denied - Insufficient Permissions (403):

{
  "success": false,
  "httpStatus": "FORBIDDEN",
  "message": "Access denied",
  "action_time": "2025-12-11T10:30:45",
  "data": "Access denied. Insufficient permissions."
}

Validation Error - Invalid Name (422):

{
  "success": false,
  "httpStatus": "UNPROCESSABLE_ENTITY",
  "message": "Validation failed",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "name": "Category name must be between 2 and 100 characters"
  }
}

Validation Error - Invalid Color Code (422):

{
  "success": false,
  "httpStatus": "UNPROCESSABLE_ENTITY",
  "message": "Validation failed",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "colorCode": "Color code must be a valid hex color (e.g., #FF5733 or #F57)"
  }
}

Validation Error - Invalid Icon URL (422):

{
  "success": false,
  "httpStatus": "UNPROCESSABLE_ENTITY",
  "message": "Validation failed",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "iconUrl": "Icon URL must be a valid image URL or path"
  }
}

2. Update Category

Purpose: Update an existing event category (requires admin privileges)

Endpoint: PUT {base_url}/e-events/categories/{categoryId}

Access Level: 🔒 Protected (Requires Bearer Token Authentication + Admin Role)

Required Roles: ROLE_STAFF_ADMIN or ROLE_SUPER_ADMIN

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Path Parameters:

Parameter Type Required Description Validation
categoryId string Yes UUID of the category to update Must be valid UUID format

Request JSON Sample:

{
  "name": "Live Music & Concerts",
  "description": "Updated description for live music events",
  "iconUrl": "https://cdn.nexgate.com/icons/music-updated.svg",
  "colorCode": "#FF1744",
  "isActive": true,
  "isFeatured": false
}

Request Body Parameters (All Optional):

Parameter Type Required Description Validation
name string No Updated category name Min: 2, Max: 100 characters
description string No Updated description Max: 500 characters
iconUrl string No Updated icon URL/path Must be valid image URL or path
colorCode string No Updated hex color code Must be valid hex format: #RRGGBB or #RGB
isActive boolean No Updated active status
isFeatured boolean No Updated featured status

Success Response: Returns standard EventCategoryResponse structure with updated values

Success Response Message: "Category updated successfully"

Standard Error Types:

Application-Level Exceptions (400-499)

Error Response Examples:

Not Found - Invalid Category ID (404):

{
  "success": false,
  "httpStatus": "NOT_FOUND",
  "message": "Category not found",
  "action_time": "2025-12-11T10:30:45",
  "data": "Category not found with ID: 550e8400-e29b-41d4-a716-446655440000"
}

Already Exists - Duplicate Name (400):

{
  "success": false,
  "httpStatus": "BAD_REQUEST",
  "message": "Category already exists",
  "action_time": "2025-12-11T10:30:45",
  "data": "Category with name 'Sports & Fitness' already exists"
}

3. Get Category by ID

Purpose: Retrieve a single category by its UUID

Endpoint: GET {base_url}/e-events/categories/{categoryId}

Access Level: 🔒 Protected (Requires Bearer Token Authentication)

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Path Parameters:

Parameter Type Required Description Validation
categoryId string Yes UUID of the category to retrieve Must be valid UUID format

Success Response: Returns standard EventCategoryResponse structure

Success Response Message: "Category retrieved successfully"

Success Response JSON Sample:

{
  "success": true,
  "httpStatus": "OK",
  "message": "Category retrieved successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "categoryId": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Music & Concerts",
    "slug": "music-concerts",
    "description": "Live music performances, concerts, festivals, and DJ events",
    "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
    "colorCode": "#E91E63",
    "isActive": true,
    "isFeatured": true,
    "eventCount": 125,
    "createdBy": "admin_user",
    "createdAt": "2025-12-11T10:30:45",
    "updatedBy": "admin_user",
    "updatedAt": "2025-12-11T14:20:30"
  }
}

Standard Error Types:

Application-Level Exceptions (400-499)


4. Get Category by Slug

Purpose: Retrieve a single category by its URL-friendly slug

Endpoint: GET {base_url}/e-events/categories/slug/{slug}

Access Level: 🔒 Protected (Requires Bearer Token Authentication)

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Path Parameters:

Parameter Type Required Description Validation
slug string Yes URL-friendly slug of the category Lowercase, hyphen-separated (e.g., music-concerts)

Example Request URL: https://api.nexgate.com/api/v1/e-events/categories/slug/music-concerts

Success Response: Returns standard EventCategoryResponse structure

Success Response Message: "Category retrieved successfully"

Standard Error Types:

Application-Level Exceptions (400-499)

Error Response Example:

Not Found - Invalid Slug (404):

{
  "success": false,
  "httpStatus": "NOT_FOUND",
  "message": "Category not found",
  "action_time": "2025-12-11T10:30:45",
  "data": "Category not found with slug: non-existent-category"
}

5. Get All Categories

Purpose: Retrieve all event categories (unpaginated, complete list)

Endpoint: GET {base_url}/e-events/categories/all

Access Level: 🔒 Protected (Requires Bearer Token Authentication)

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Success Response JSON Sample:

{
  "success": true,
  "httpStatus": "OK",
  "message": "Categories retrieved successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": [
    {
      "categoryId": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Music & Concerts",
      "slug": "music-concerts",
      "description": "Live music performances, concerts, festivals, and DJ events",
      "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
      "colorCode": "#E91E63",
      "isActive": true,
      "isFeatured": true,
      "eventCount": 125,
      "createdBy": "admin_user",
      "createdAt": "2025-12-11T10:30:45",
      "updatedBy": null,
      "updatedAt": null
    },
    {
      "categoryId": "660e8400-e29b-41d4-a716-446655440001",
      "name": "Sports & Fitness",
      "slug": "sports-fitness",
      "description": "Yoga, gym classes, marathons, tournaments, and outdoor activities",
      "iconUrl": "https://cdn.nexgate.com/icons/sports.svg",
      "colorCode": "#4CAF50",
      "isActive": true,
      "isFeatured": true,
      "eventCount": 89,
      "createdBy": "admin_user",
      "createdAt": "2025-12-11T10:30:45",
      "updatedBy": null,
      "updatedAt": null
    }
  ]
}

Success Response Fields:

Field Description
data Array of EventCategoryResponse objects (complete list, no pagination)

Standard Error Types:

Application-Level Exceptions (400-499)


6. Get Paginated Categories

Purpose: Retrieve event categories with pagination support

Endpoint: GET {base_url}/e-events/categories/paged

Access Level: 🔒 Protected (Requires Bearer Token Authentication)

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Query Parameters:

Parameter Type Required Description Validation Default
page integer No Page number (1-indexed) Min: 1 1
size integer No Number of items per page Min: 1, Max: 100 10

Example Request URL: https://api.nexgate.com/api/v1/e-events/categories/paged?page=1&size=10

Success Response JSON Sample:

{
  "success": true,
  "httpStatus": "OK",
  "message": "Categories retrieved successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": {
    "content": [
      {
        "categoryId": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Music & Concerts",
        "slug": "music-concerts",
        "description": "Live music performances, concerts, festivals, and DJ events",
        "iconUrl": "https://cdn.nexgate.com/icons/music.svg",
        "colorCode": "#E91E63",
        "isActive": true,
        "isFeatured": true,
        "eventCount": 125,
        "createdBy": "admin_user",
        "createdAt": "2025-12-11T10:30:45",
        "updatedBy": null,
        "updatedAt": null
      }
    ],
    "pageable": {
      "pageNumber": 0,
      "pageSize": 10,
      "sort": {
        "sorted": false,
        "empty": true,
        "unsorted": true
      },
      "offset": 0,
      "paged": true,
      "unpaged": false
    },
    "totalPages": 1,
    "totalElements": 10,
    "last": true,
    "size": 10,
    "number": 0,
    "sort": {
      "sorted": false,
      "empty": true,
      "unsorted": true
    },
    "numberOfElements": 10,
    "first": true,
    "empty": false
  }
}

Success Response Fields:

Field Description
content Array of EventCategoryResponse objects for current page
totalPages Total number of pages available
totalElements Total number of categories across all pages
size Number of items per page (requested size)
number Current page number (0-indexed in response)
first Boolean indicating if this is the first page
last Boolean indicating if this is the last page
empty Boolean indicating if the result set is empty

Standard Error Types:

Application-Level Exceptions (400-499)


7. Seed Categories

Purpose: Populate the database with default event categories (requires admin privileges)

Endpoint: POST {base_url}/e-events/categories/seed

Access Level: 🔒 Protected (Requires Bearer Token Authentication + Admin Role)

Required Roles: ROLE_STAFF_ADMIN or ROLE_SUPER_ADMIN

Authentication: Bearer Token

Request Headers:

Header Type Required Description
Authorization string Yes Bearer token for authentication (format: Bearer <token>)
Content-Type string Yes Must be application/json

Request Body: None (no body required)

Default Categories Seeded:

This endpoint creates the following 10 default categories (if they don't already exist):

  1. Music & Concerts - Live music performances, concerts, festivals, and DJ events (Featured)
  2. Sports & Fitness - Yoga, gym classes, marathons, tournaments, and outdoor activities (Featured)
  3. Business & Networking - Professional meetups, conferences, workshops, and networking events (Featured)
  4. Food & Drink - Food festivals, cooking classes, wine tastings, and dining experiences
  5. Arts & Culture - Art exhibitions, theater, dance, museums, and cultural events
  6. Education & Learning - Workshops, seminars, courses, bootcamps, and training sessions (Featured)
  7. Social & Community - Parties, meetups, social clubs, game nights, and community events
  8. Technology & Innovation - Tech talks, hackathons, product launches, and startup events
  9. Wellness & Spirituality - Meditation, yoga retreats, healing workshops, and mindfulness events
  10. Entertainment - Comedy shows, movie screenings, gaming, and entertainment events

Success Response JSON Sample:

{
  "success": true,
  "httpStatus": "OK",
  "message": "Categories seeded successfully",
  "action_time": "2025-12-11T10:30:45",
  "data": [
    {
      "categoryId": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Music & Concerts",
      "slug": "music-concerts",
      "description": "Live music performances, concerts, festivals, and DJ events",
      "iconUrl": "",
      "colorCode": "#E91E63",
      "isActive": true,
      "isFeatured": true,
      "eventCount": 0,
      "createdBy": "admin_user",
      "createdAt": "2025-12-11T10:30:45",
      "updatedBy": null,
      "updatedAt": null
    },
    {
      "categoryId": "660e8400-e29b-41d4-a716-446655440001",
      "name": "Sports & Fitness",
      "slug": "sports-fitness",
      "description": "Yoga, gym classes, marathons, tournaments, and outdoor activities",
      "iconUrl": "",
      "colorCode": "#4CAF50",
      "isActive": true,
      "isFeatured": true,
      "eventCount": 0,
      "createdBy": "admin_user",
      "createdAt": "2025-12-11T10:30:45",
      "updatedBy": null,
      "updatedAt": null
    }
    // ... (remaining 8 categories)
  ]
}

Success Response Fields:

Field Description
data Array of EventCategoryResponse objects (newly created categories only, or all existing if none were created)

Behavior Notes:

Standard Error Types:

Application-Level Exceptions (400-499)

Error Response Example:

Access Denied - Not Admin (403):

{
  "success": false,
  "httpStatus": "FORBIDDEN",
  "message": "Access denied",
  "action_time": "2025-12-11T10:30:45",
  "data": "Access denied. Insufficient permissions."
}

Quick Reference Guide

Common HTTP Status Codes

Authentication & Authorization

Data Format Standards

Category Name Rules

Slug Generation Rules

Icon URL Validation

Color Code Validation

Categories with isFeatured: true are typically displayed prominently in UI:

Event Count


Revision #1
Created 11 December 2025 09:37:06 by Admin Qbit
Updated 11 December 2025 09:38:05 by Admin Qbit