#ifndef API_CLIENT_H #define API_CLIENT_H #include #include #include #include #include #include #include #include #include "AttendanceTypes.h" class ApiClient : public QObject { Q_OBJECT public: explicit ApiClient(QObject *parent = nullptr); void setServerUrl(const QString &url); QString serverUrl() const; void fetchRecords(int limit = 1000, int offset = 0); void fetchStatistics(); void clearAllRecords(); void deleteRecord(const QString ×tamp, const QString &studentId); void fetchTimeSlots(); void uploadTimeSlots(const QVector &timeSlots); void fetchMappingConfig(); void uploadMappingConfig(const QMap &studentNameMap, const QMap &classNameMap); void fetchFaceIdMapping(); void uploadFaceIdMapping(const QMap &mapping); void fetchFacePhotos(); void fetchAllStudentIds(); void deleteFace(const QString &studentId, bool deleteRecords); void checkHealth(); signals: void recordsFetched(const QVector &records); void statisticsFetched(int total, int today, const QString &serverTime); void recordsCleared(bool success, const QString &message); void recordDeleted(bool success, const QString &message); void timeSlotsFetched(const QVector &timeSlots); void timeSlotsUploaded(bool success, const QString &message); void mappingConfigFetched(const QMap &studentNameMap, const QMap &classNameMap); void mappingConfigUploaded(bool success, const QString &message); void faceIdMappingFetched(const QMap &mapping); void faceIdMappingUploaded(bool success, const QString &message); void facePhotosFetched(const QStringList &photoIds); void allStudentIdsFetched(const QStringList &studentIds); void faceDeleted(bool success, const QString &studentId, int recordsDeleted, const QString &message); void healthChecked(bool healthy, const QString &message); void connectionUnavailable(const QString &message); void networkError(const QString &message); private: QString buildUrl(const QString &endpoint, const QMap ¶ms = {}) const; QNetworkRequest createRequest(const QString &url, bool encryptedResponse = false) const; QVector parseRecords(const QByteArray &data) const; QByteArray maybeDecrypt(const QByteArray &data, bool encrypted) const; void emitNetworkError(const QString &prefix, QNetworkReply *reply); bool isConnectionError(QNetworkReply::NetworkError error) const; QNetworkAccessManager m_networkManager; QString m_serverUrl; }; #endif