#pragma once #include "base/worker_thread.hpp" #include #include #include #include #include #include namespace platform { class HttpClient; } // This class is thread-safe. class User { public: struct Details { using ReviewId = uint64_t; std::vector m_reviewIds; }; enum SocialTokenType { Facebook, Google }; using BuildRequestHandler = std::function; using SuccessHandler = std::function; using ErrorHandler = std::function; using CompleteUploadingHandler = std::function; User(); ~User(); void Authenticate(std::string const & socialToken, SocialTokenType socialTokenType); bool IsAuthenticated() const; void ResetAccessToken(); void UpdateUserDetails(); std::string GetAccessToken() const; Details GetDetails() const; void UploadUserReviews(std::string && dataStr, CompleteUploadingHandler const & onCompleteUploading); private: void Init(); void SetAccessToken(std::string const & accessToken); void RequestUserDetails(); void Request(std::string const & url, BuildRequestHandler const & onBuildRequest, SuccessHandler const & onSuccess, ErrorHandler const & onError = nullptr); std::string m_accessToken; mutable std::mutex m_mutex; std::condition_variable m_condition; bool m_needTerminate = false; bool m_authenticationInProgress = false; Details m_details; base::WorkerThread m_workerThread; };