X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/46432ca916d65b4801a11f7b8196201bea6d2d2d..46d0fa38003ef0b122fea77dfaa252fa832cb5a3:/include/stg/users.h

diff --git a/include/stg/users.h b/include/stg/users.h
index 1a8d7a43..a0be8493 100644
--- a/include/stg/users.h
+++ b/include/stg/users.h
@@ -18,53 +18,66 @@
  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
  */
 
-#ifndef USERS_H
-#define USERS_H
+#pragma once
+
+#include "subscriptions.h"
 
 #include <string>
 
-#include "notifer.h"
-#include "user.h"
+#include <cstdint>
+
+namespace STG
+{
+
+class Admin;
+class User;
+struct Auth;
 
-class ADMIN;
+class Users
+{
+    public:
+        virtual ~Users() = default;
 
-class USERS {
-public:
-    virtual ~USERS() {}
-    virtual int  FindByName(const std::string & login, USER_PTR * user) = 0;
-    virtual int  FindByName(const std::string & login, CONST_USER_PTR * user) const = 0;
+        using UserPtr = User*;
+        using ConstUserPtr = const User*;
 
-    virtual bool TariffInUse(const std::string & tariffName) const = 0;
+        virtual int  FindByName(const std::string& login, UserPtr* user) = 0;
+        virtual int  FindByName(const std::string& login, ConstUserPtr* user) const = 0;
+        virtual bool Exists(const std::string& login) const = 0;
 
-    virtual void AddNotifierUserAdd(NOTIFIER_BASE<USER_PTR> * notifier) = 0;
-    virtual void DelNotifierUserAdd(NOTIFIER_BASE<USER_PTR> * notifier) = 0;
+        virtual bool TariffInUse(const std::string& tariffName) const = 0;
 
-    virtual void AddNotifierUserDel(NOTIFIER_BASE<USER_PTR> * notifier) = 0;
-    virtual void DelNotifierUserDel(NOTIFIER_BASE<USER_PTR> * notifier) = 0;
+        template <typename F>
+        auto onAdd(F&& f) { return m_onAddCallbacks.add(std::forward<F>(f)); }
+        template <typename F>
+        auto onDel(F&& f) { return m_onDelCallbacks.add(std::forward<F>(f)); }
 
-    virtual int  Add(const std::string & login, const ADMIN * admin) = 0;
-    virtual void Del(const std::string & login, const ADMIN * admin) = 0;
+        virtual int  Add(const std::string& login, const Admin* admin) = 0;
+        virtual void Del(const std::string& login, const Admin* admin) = 0;
 
-    virtual bool Authorize(const std::string & login, uint32_t ip,
-                           uint32_t enabledDirs, const AUTH * auth) = 0;
-    virtual bool Unauthorize(const std::string & login,
-                             const AUTH * auth,
-                             const std::string & reason = std::string()) = 0;
+        virtual bool Authorize(const std::string& login, uint32_t ip,
+                               uint32_t enabledDirs, const Auth* auth) = 0;
+        virtual bool Unauthorize(const std::string& login,
+                                 const Auth* auth,
+                                 const std::string& reason = {}) = 0;
 
-    virtual int  ReadUsers() = 0;
-    virtual size_t Count() const = 0;
+        virtual int  ReadUsers() = 0;
+        virtual size_t Count() const = 0;
 
-    virtual int  FindByIPIdx(uint32_t ip, USER_PTR * user) const = 0;
-    virtual bool IsIPInIndex(uint32_t ip) const = 0;
-    virtual bool IsIPInUse(uint32_t ip, const std::string & login, CONST_USER_PTR * user) const = 0;
+        virtual int  FindByIPIdx(uint32_t ip, User** user) const = 0;
+        virtual bool IsIPInIndex(uint32_t ip) const = 0;
+        virtual bool IsIPInUse(uint32_t ip, const std::string & login, const User** user) const = 0;
 
-    virtual int  OpenSearch() = 0;
-    virtual int  SearchNext(int handle, USER_PTR * u) = 0;
-    virtual int  CloseSearch(int handle) = 0;
+        virtual unsigned int  OpenSearch() = 0;
+        virtual int  SearchNext(int handle, User** u) = 0;
+        virtual int  CloseSearch(int handle) = 0;
 
-    virtual int  Start() = 0;
-    virtual int  Stop() = 0;
+        virtual int  Start() = 0;
+        virtual int  Stop() = 0;
 
+    protected:
+        Subscriptions<UserPtr> m_onAddCallbacks;
+        Subscriptions<UserPtr> m_onDelCallbacks;
 };
 
-#endif
+}