ApiResponse.java

package com.stocks.stockease.dto;

/**
 * Generic wrapper for all API responses.
 * 
 * Standardizes response format across endpoints with success flag,
 * optional message, and typed data payload. Enables consistent
 * client-side response handling.
 * 
 * Example JSON response:
 * {
 *   "success": true,
 *   "message": "Operation successful",
 *   "data": { Object }
 * }
 * 
 * @author Team StockEase
 * @version 1.0
 * @since 2025-01-01
 */
public class ApiResponse<T> {

    /**
     * Success indicator. True if operation completed successfully, false otherwise.
     * Used by clients to determine response handling logic.
     */
    private boolean success;

    /**
     * Human-readable message describing operation outcome.
     * Examples: "Login successful", "Product not found", "Validation error"
     */
    private String message;

    /**
     * Typed data payload returned by operation.
     * May be null for error responses or operations with no data output (e.g., DELETE).
     */
    private T data;

    /**
     * Constructs a complete API response.
     * 
     * @param success whether operation succeeded
     * @param message human-readable outcome message
     * @param data operation result (null if no data)
     */
    public ApiResponse(boolean success, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }

    /**
     * Returns success status of operation.
     * 
     * @return true if successful; false otherwise
     */
    public boolean isSuccess() {
        return success;
    }

    /**
     * Sets success status of operation.
     * 
     * @param success success flag
     */
    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * Returns outcome message.
     * 
     * @return message string
     */
    public String getMessage() {
        return message;
    }

    /**
     * Sets outcome message.
     * 
     * @param message message text
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * Returns operation result data.
     * 
     * @return typed data object; null if no data
     */
    public T getData() {
        return data;
    }

    /**
     * Sets operation result data.
     * 
     * @param data typed data object
     */
    public void setData(T data) {
        this.data = data;
    }
}