comment desktop api layer
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Handles sending HTTP requests to the backend server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api;
|
package org.example.petshopdesktop.api;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
@@ -116,6 +122,15 @@ public class ApiClient {
|
|||||||
return handleResponse(response, responseClass);
|
return handleResponse(response, responseClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads a single file as a multipart/form-data POST.
|
||||||
|
* Manually builds the multipart body since Java's HttpClient doesn't have built-in support.
|
||||||
|
* @param path API endpoint path
|
||||||
|
* @param partName the form field name for the file
|
||||||
|
* @param filePath local file to upload
|
||||||
|
* @param responseClass type to deserialize the response into
|
||||||
|
* @return the parsed response
|
||||||
|
*/
|
||||||
public <T> T postMultipart(String path, String partName, Path filePath, Class<T> responseClass) throws Exception {
|
public <T> T postMultipart(String path, String partName, Path filePath, Class<T> responseClass) throws Exception {
|
||||||
String boundary = "----PetShopDesktop" + UUID.randomUUID();
|
String boundary = "----PetShopDesktop" + UUID.randomUUID();
|
||||||
String mimeType = Files.probeContentType(filePath);
|
String mimeType = Files.probeContentType(filePath);
|
||||||
@@ -146,6 +161,17 @@ public class ApiClient {
|
|||||||
return handleResponse(response, responseClass);
|
return handleResponse(response, responseClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads a file along with an optional text field in a single multipart POST.
|
||||||
|
* Uses SequenceInputStream to stream the file instead of loading everything into one byte array.
|
||||||
|
* @param path API endpoint path
|
||||||
|
* @param filePartName form field name for the file
|
||||||
|
* @param filePath local file to upload
|
||||||
|
* @param textPartName form field name for the text
|
||||||
|
* @param textContent the text value to send alongside the file
|
||||||
|
* @param responseClass type to deserialize the response into
|
||||||
|
* @return the parsed response
|
||||||
|
*/
|
||||||
public <T> T postMultipartWithText(String path, String filePartName, Path filePath,
|
public <T> T postMultipartWithText(String path, String filePartName, Path filePath,
|
||||||
String textPartName, String textContent,
|
String textPartName, String textContent,
|
||||||
Class<T> responseClass) throws Exception {
|
Class<T> responseClass) throws Exception {
|
||||||
@@ -218,6 +244,11 @@ public class ApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a DELETE with a JSON body (used for batch deletes).
|
||||||
|
* @param path API endpoint path
|
||||||
|
* @param requestBody object to serialize as the request body
|
||||||
|
*/
|
||||||
public void deleteWithBody(String path, Object requestBody) throws Exception {
|
public void deleteWithBody(String path, Object requestBody) throws Exception {
|
||||||
String jsonBody = objectMapper.writeValueAsString(requestBody);
|
String jsonBody = objectMapper.writeValueAsString(requestBody);
|
||||||
|
|
||||||
@@ -244,6 +275,12 @@ public class ApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the HTTP status and either deserializes the body or throws a readable error.
|
||||||
|
* @param response the raw HTTP response
|
||||||
|
* @param responseClass type to deserialize into
|
||||||
|
* @return the parsed response body, or null for 204/empty
|
||||||
|
*/
|
||||||
private <T> T handleResponse(HttpResponse<String> response, Class<T> responseClass) throws Exception {
|
private <T> T handleResponse(HttpResponse<String> response, Class<T> responseClass) throws Exception {
|
||||||
int statusCode = response.statusCode();
|
int statusCode = response.statusCode();
|
||||||
|
|
||||||
@@ -263,6 +300,13 @@ public class ApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to extract a human-readable error from the JSON response body.
|
||||||
|
* Looks for an "errors" map first (field validation), then a "message" field,
|
||||||
|
* and falls back to the raw status code.
|
||||||
|
* @param response the failed HTTP response
|
||||||
|
* @return a user-facing error string
|
||||||
|
*/
|
||||||
private String parseErrorMessage(HttpResponse<String> response) {
|
private String parseErrorMessage(HttpResponse<String> response) {
|
||||||
try {
|
try {
|
||||||
if (response.body() != null && !response.body().isEmpty()) {
|
if (response.body() != null && !response.body().isEmpty()) {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Stores the base URL and connection settings for the API.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api;
|
package org.example.petshopdesktop.api;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Manages a real-time WebSocket connection for the chat feature.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api;
|
package org.example.petshopdesktop.api;
|
||||||
|
|
||||||
import org.example.petshopdesktop.api.dto.chat.ConversationResponse;
|
import org.example.petshopdesktop.api.dto.chat.ConversationResponse;
|
||||||
@@ -59,6 +65,10 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a listener that gets called when chat notification state changes.
|
||||||
|
* @param listener receives true if there are chats needing attention
|
||||||
|
*/
|
||||||
public void addNotificationListener(Consumer<Boolean> listener) {
|
public void addNotificationListener(Consumer<Boolean> listener) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
notificationListeners.add(listener);
|
notificationListeners.add(listener);
|
||||||
@@ -66,6 +76,11 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seeds the global conversation map from a full list fetch.
|
||||||
|
* Called on first load and on refresh to sync local state with server.
|
||||||
|
* @param conversations the full list from the REST API
|
||||||
|
*/
|
||||||
public void initializeState(List<ConversationResponse> conversations) {
|
public void initializeState(List<ConversationResponse> conversations) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
globalConversations.clear();
|
globalConversations.clear();
|
||||||
@@ -76,6 +91,12 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
updateNotificationState();
|
updateNotificationState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks a conversation as replied to by updating the last sender and read state.
|
||||||
|
* Used after the current user sends a message so the badge clears.
|
||||||
|
* @param conversationId the conversation that was replied to
|
||||||
|
* @param senderId the user who sent the reply
|
||||||
|
*/
|
||||||
public void markConversationReplied(Long conversationId, Long senderId) {
|
public void markConversationReplied(Long conversationId, Long senderId) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
ConversationResponse conv = globalConversations.get(conversationId);
|
ConversationResponse conv = globalConversations.get(conversationId);
|
||||||
@@ -100,6 +121,12 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if any open conversation needs staff attention.
|
||||||
|
* Two cases count: unassigned chats waiting for pickup,
|
||||||
|
* and chats assigned to me where the customer sent the last message.
|
||||||
|
* @return true if there's at least one chat needing action
|
||||||
|
*/
|
||||||
public boolean hasActionableChats() {
|
public boolean hasActionableChats() {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
UserSession session = UserSession.getInstance();
|
UserSession session = UserSession.getInstance();
|
||||||
@@ -125,6 +152,9 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recalculates the badge state and notifies listeners only if it changed.
|
||||||
|
*/
|
||||||
private void updateNotificationState() {
|
private void updateNotificationState() {
|
||||||
boolean currentState = hasActionableChats();
|
boolean currentState = hasActionableChats();
|
||||||
List<Consumer<Boolean>> listeners;
|
List<Consumer<Boolean>> listeners;
|
||||||
@@ -153,6 +183,10 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the WebSocket and sends a STOMP CONNECT frame with the JWT.
|
||||||
|
* No-ops if already connected or mid-handshake.
|
||||||
|
*/
|
||||||
public void connect() {
|
public void connect() {
|
||||||
String token = UserSession.getInstance().getJwtToken();
|
String token = UserSession.getInstance().getJwtToken();
|
||||||
if (token == null || token.isBlank()) {
|
if (token == null || token.isBlank()) {
|
||||||
@@ -167,6 +201,7 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
connecting = true;
|
connecting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert the REST base URL to a WebSocket URL
|
||||||
String wsUrl = ApiConfig.getInstance().getBaseUrl()
|
String wsUrl = ApiConfig.getInstance().getBaseUrl()
|
||||||
.replaceFirst("^http://", "ws://")
|
.replaceFirst("^http://", "ws://")
|
||||||
.replaceFirst("^https://", "wss://") + "/ws/chat";
|
.replaceFirst("^https://", "wss://") + "/ws/chat";
|
||||||
@@ -236,6 +271,13 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a chat message over the WebSocket using a STOMP SEND frame.
|
||||||
|
* Falls back to reconnecting if the socket isn't ready.
|
||||||
|
* @param conversationId target conversation
|
||||||
|
* @param content the message text
|
||||||
|
* @return true if the frame was sent, false if not connected
|
||||||
|
*/
|
||||||
public boolean sendMessage(Long conversationId, String content) {
|
public boolean sendMessage(Long conversationId, String content) {
|
||||||
String token = UserSession.getInstance().getJwtToken();
|
String token = UserSession.getInstance().getJwtToken();
|
||||||
if (token == null || token.isBlank()) {
|
if (token == null || token.isBlank()) {
|
||||||
@@ -287,6 +329,10 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
applySelectedConversationSubscriptionLocked();
|
applySelectedConversationSubscriptionLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subscribes to the currently selected conversation's message topic.
|
||||||
|
* Unsubscribes from the previous one first if it changed.
|
||||||
|
*/
|
||||||
private void applySelectedConversationSubscriptionLocked() {
|
private void applySelectedConversationSubscriptionLocked() {
|
||||||
if (webSocket == null || !connected) {
|
if (webSocket == null || !connected) {
|
||||||
return;
|
return;
|
||||||
@@ -324,6 +370,12 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
updateNotificationState();
|
updateNotificationState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a single STOMP frame and dispatches it.
|
||||||
|
* Handles CONNECTED (finish handshake), MESSAGE (deliver to listeners),
|
||||||
|
* and ERROR frames.
|
||||||
|
* @param frame the raw STOMP frame text without the null terminator
|
||||||
|
*/
|
||||||
private void handleFrame(String frame) {
|
private void handleFrame(String frame) {
|
||||||
String normalized = frame.replace("\r\n", "\n");
|
String normalized = frame.replace("\r\n", "\n");
|
||||||
int separator = normalized.indexOf("\n\n");
|
int separator = normalized.indexOf("\n\n");
|
||||||
@@ -354,11 +406,14 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ("MESSAGE".equals(command)) {
|
if ("MESSAGE".equals(command)) {
|
||||||
|
// Look up which topic this subscription maps to
|
||||||
String destination;
|
String destination;
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
destination = destinationBySubscription.get(headers.get("subscription"));
|
destination = destinationBySubscription.get(headers.get("subscription"));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
// Messages on a specific conversation topic are chat messages;
|
||||||
|
// messages on the general conversations topic are conversation updates
|
||||||
if (destination != null && destination.startsWith("/topic/chat/conversations/")) {
|
if (destination != null && destination.startsWith("/topic/chat/conversations/")) {
|
||||||
MessageResponse message = ApiClient.getInstance().getObjectMapper().readValue(bodyPart, MessageResponse.class);
|
MessageResponse message = ApiClient.getInstance().getObjectMapper().readValue(bodyPart, MessageResponse.class);
|
||||||
if (messageListener != null) {
|
if (messageListener != null) {
|
||||||
@@ -371,12 +426,14 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
.notifyNewMessage(message.getSenderDisplayName(), message.getContent());
|
.notifyNewMessage(message.getSenderDisplayName(), message.getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keep the global map in sync for badge calculations
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
ConversationResponse conv = globalConversations.get(message.getConversationId());
|
ConversationResponse conv = globalConversations.get(message.getConversationId());
|
||||||
if (conv != null) {
|
if (conv != null) {
|
||||||
conv.setLastMessage(message.getContent());
|
conv.setLastMessage(message.getContent());
|
||||||
conv.setLastSenderId(message.getSenderId());
|
conv.setLastSenderId(message.getSenderId());
|
||||||
}
|
}
|
||||||
|
// Incoming message from someone else marks it unread again
|
||||||
if (message.getSenderId() != null && !message.getSenderId().equals(currentUserId)) {
|
if (message.getSenderId() != null && !message.getSenderId().equals(currentUserId)) {
|
||||||
readConversationIds.remove(message.getConversationId());
|
readConversationIds.remove(message.getConversationId());
|
||||||
}
|
}
|
||||||
@@ -416,6 +473,11 @@ public class ChatRealtimeClient implements WebSocket.Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
/**
|
||||||
|
* Accumulates WebSocket text fragments and splits on the STOMP null delimiter.
|
||||||
|
* A single WebSocket message can contain partial frames, so we buffer until
|
||||||
|
* we see the \0 that marks the end of a STOMP frame.
|
||||||
|
*/
|
||||||
public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
|
public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
frameBuffer.append(data);
|
frameBuffer.append(data);
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for an activity log entry.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.activity;
|
package org.example.petshopdesktop.api.dto.activity;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating an adoption.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.adoption;
|
package org.example.petshopdesktop.api.dto.adoption;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for an adoption record.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.adoption;
|
package org.example.petshopdesktop.api.dto.adoption;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds daily sales total data returned from the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.analytics;
|
package org.example.petshopdesktop.api.dto.analytics;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds all the summary data shown on the dashboard.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.analytics;
|
package org.example.petshopdesktop.api.dto.analytics;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data for a top-selling product from the analytics endpoint.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.analytics;
|
package org.example.petshopdesktop.api.dto.analytics;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating an appointment.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.appointment;
|
package org.example.petshopdesktop.api.dto.appointment;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for an appointment.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.appointment;
|
package org.example.petshopdesktop.api.dto.appointment;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds the URL returned after uploading a user avatar.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.auth;
|
package org.example.petshopdesktop.api.dto.auth;
|
||||||
|
|
||||||
public class AvatarUploadResponse {
|
public class AvatarUploadResponse {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds the username and password sent when logging in.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.auth;
|
package org.example.petshopdesktop.api.dto.auth;
|
||||||
|
|
||||||
public class LoginRequest {
|
public class LoginRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds the token and user info returned after logging in.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.auth;
|
package org.example.petshopdesktop.api.dto.auth;
|
||||||
|
|
||||||
public class LoginResponse {
|
public class LoginResponse {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds the current user's profile information from the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.auth;
|
package org.example.petshopdesktop.api.dto.auth;
|
||||||
|
|
||||||
public class UserInfoResponse {
|
public class UserInfoResponse {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when starting a new conversation.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.chat;
|
package org.example.petshopdesktop.api.dto.chat;
|
||||||
|
|
||||||
public class ConversationRequest {
|
public class ConversationRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a conversation.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.chat;
|
package org.example.petshopdesktop.api.dto.chat;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when sending a chat message.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.chat;
|
package org.example.petshopdesktop.api.dto.chat;
|
||||||
|
|
||||||
public class MessageRequest {
|
public class MessageRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a chat message.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.chat;
|
package org.example.petshopdesktop.api.dto.chat;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when updating a conversation.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.chat;
|
package org.example.petshopdesktop.api.dto.chat;
|
||||||
|
|
||||||
public class UpdateConversationRequest {
|
public class UpdateConversationRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds a list of IDs to delete multiple records at once.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.common;
|
package org.example.petshopdesktop.api.dto.common;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds an ID and label pair used to fill dropdown menus.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.common;
|
package org.example.petshopdesktop.api.dto.common;
|
||||||
|
|
||||||
public class DropdownOption {
|
public class DropdownOption {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds a page of results along with pagination details.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.common;
|
package org.example.petshopdesktop.api.dto.common;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a coupon.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.coupon;
|
package org.example.petshopdesktop.api.dto.coupon;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a coupon.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.coupon;
|
package org.example.petshopdesktop.api.dto.coupon;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating an employee.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.employee;
|
package org.example.petshopdesktop.api.dto.employee;
|
||||||
|
|
||||||
public class EmployeeRequest {
|
public class EmployeeRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for an employee.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.employee;
|
package org.example.petshopdesktop.api.dto.employee;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when updating inventory.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.inventory;
|
package org.example.petshopdesktop.api.dto.inventory;
|
||||||
|
|
||||||
public class InventoryRequest {
|
public class InventoryRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for an inventory record.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.inventory;
|
package org.example.petshopdesktop.api.dto.inventory;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a pet.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.pet;
|
package org.example.petshopdesktop.api.dto.pet;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a pet.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.pet;
|
package org.example.petshopdesktop.api.dto.pet;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a product.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.product;
|
package org.example.petshopdesktop.api.dto.product;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a product.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.product;
|
package org.example.petshopdesktop.api.dto.product;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when linking a product to a supplier.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.productsupplier;
|
package org.example.petshopdesktop.api.dto.productsupplier;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a product-supplier link.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.productsupplier;
|
package org.example.petshopdesktop.api.dto.productsupplier;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a purchase order.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.purchaseorder;
|
package org.example.petshopdesktop.api.dto.purchaseorder;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data for a single item in a sale request.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.sale;
|
package org.example.petshopdesktop.api.dto.sale;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a single sale item.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.sale;
|
package org.example.petshopdesktop.api.dto.sale;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating a sale.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.sale;
|
package org.example.petshopdesktop.api.dto.sale;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a sale.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.sale;
|
package org.example.petshopdesktop.api.dto.sale;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a service.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.service;
|
package org.example.petshopdesktop.api.dto.service;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a service.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.service;
|
package org.example.petshopdesktop.api.dto.service;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a supplier.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.supplier;
|
package org.example.petshopdesktop.api.dto.supplier;
|
||||||
|
|
||||||
public class SupplierRequest {
|
public class SupplierRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a supplier.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.supplier;
|
package org.example.petshopdesktop.api.dto.supplier;
|
||||||
|
|
||||||
public class SupplierResponse {
|
public class SupplierResponse {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data sent to the server when creating or updating a user.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.user;
|
package org.example.petshopdesktop.api.dto.user;
|
||||||
|
|
||||||
public class UserRequest {
|
public class UserRequest {
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Holds data returned from the server for a user.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.dto.user;
|
package org.example.petshopdesktop.api.dto.user;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to fetch activity logs from the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage adoptions through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to fetch analytics and dashboard data from the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import org.example.petshopdesktop.api.ApiClient;
|
import org.example.petshopdesktop.api.ApiClient;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage appointments through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods for logging in and managing authentication.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import org.example.petshopdesktop.api.ApiClient;
|
import org.example.petshopdesktop.api.ApiClient;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage chat conversations and messages.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage coupons through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage customers through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to fetch dropdown option lists from the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage employees through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage inventory through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage pets through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage products through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage product-supplier links through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage purchase orders through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage sales through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage services through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage suppliers through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Provides methods to manage user accounts through the server.
|
||||||
|
*
|
||||||
|
* Author: Harkamal
|
||||||
|
* Date: April 2026
|
||||||
|
*/
|
||||||
package org.example.petshopdesktop.api.endpoints;
|
package org.example.petshopdesktop.api.endpoints;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|||||||
Reference in New Issue
Block a user