00001
00002
00003
00004
00005
00006
00007
00008 #include "User.h"
00009 #include "Basket.h"
00010
00011 #define KEY_USR_UID "uid"
00012 #define KEY_USR_NAME "name"
00013 #define KEY_USR_SURNAME "surname"
00014 #define KEY_USR_ADDRESS "address"
00015 #define KEY_USR_CITY "city"
00016 #define KEY_USR_LOGIN "login"
00017 #define KEY_USR_PASSWD "password"
00018 #define KEY_USR_ADMIN "admin"
00019 #define QUERY_LOGIN "SELECT * FROM users WHERE login = %0q and password = %1q"
00020 #define QUERY_FETCH "SELECT * FROM users WHERE uid = "
00021 #define QUERY_ADMIN_USERLST "SELECT * FROM users WHERE admin=0 ORDER BY surname, name"
00022
00028 User::User() : ManagedObject("users")
00029 {
00030 }
00031
00038 User::User(Row &aRow) : ManagedObject("users", aRow)
00039 {
00040 }
00041
00045 User::~User()
00046 {
00047 }
00048
00054 string User::primaryKey()
00055 {
00056 return KEY_USR_UID;
00057 }
00058
00069 User * User::factory(string aName, string aSurname, string aLogin,
00070 string aPasswd, string anAddress, string aCity)
00071 {
00072 User *nu = new NormalUser();
00073 nu->setIntForKey(KEY_USR_UID, 0);
00074 nu->setIntForKey(KEY_USR_ADMIN, 0);
00075 nu->setValueForKey(KEY_USR_NAME, aName);
00076 nu->setValueForKey(KEY_USR_SURNAME, aSurname);
00077 nu->setValueForKey(KEY_USR_ADDRESS, anAddress);
00078 nu->setValueForKey(KEY_USR_CITY, aCity);
00079 nu->setValueForKey(KEY_USR_LOGIN, aLogin);
00080 nu->setValueForKey(KEY_USR_PASSWD, aPasswd);
00081 if (!nu->store()) {
00082 delete nu;
00083 return NULL;
00084 }
00085
00086 return nu;
00087 }
00088
00098 User * User::login(string username, string passwd)
00099 {
00100 Database &db = Database::Instance();
00101
00102 Connection *conn = db.getConnection();
00103 Query q = conn->query(QUERY_LOGIN);
00104 q.parse();
00105
00106 StoreQueryResult res = q.store(username, passwd);
00107 if (!res.empty()) {
00108 StoreQueryResult::const_iterator it = res.begin();
00109 Row row = *it;
00110
00111 User *newUser = NULL;
00112
00113 if (row[KEY_USR_ADMIN] == "1")
00114 newUser = new AdminUser(row);
00115 else
00116 newUser = new NormalUser(row);
00117
00118 return newUser;
00119 }
00120
00121 return NULL;
00122 }
00123
00131 User * User::userByID(int anUid)
00132 {
00133 Database &db = Database::Instance();
00134
00135 Connection *conn = db.getConnection();
00136 Query q = conn->query();
00137 q << QUERY_FETCH << anUid;
00138 StoreQueryResult res = q.store();
00139 if (!res.empty()) {
00140 StoreQueryResult::const_iterator it = res.begin();
00141 Row row = *it;
00142
00143 if (row[KEY_USR_ADMIN] == "1")
00144 return new AdminUser(row);
00145 else
00146 return new NormalUser(row);
00147 }
00148
00149 return NULL;
00150 }
00151
00152 ulonglong User::uniqueID()
00153 {
00154 return (ulonglong) intForKey(KEY_USR_UID);
00155 }
00156
00162 string User::fullName()
00163 {
00164 return valueForKey(KEY_USR_NAME) + " " + valueForKey(KEY_USR_SURNAME);
00165 }
00166
00167 bool User::isAdmin()
00168 {
00169 AdminUser *admin = dynamic_cast<AdminUser *> (this);
00170
00171 return (admin != NULL);
00172
00173 }
00174
00175 ostream& operator<<(ostream& aStream, User & u) {
00176 return aStream << "PERSON DETAIL\n"
00177 << "Name : " << u.valueForKey(KEY_USR_NAME) << " "
00178 << u.valueForKey(KEY_USR_SURNAME) << endl
00179 << "Login : " << u.valueForKey(KEY_USR_LOGIN) << endl
00180 << "Address: " << u.valueForKey(KEY_USR_ADDRESS) << " - "
00181 << u.valueForKey(KEY_USR_CITY) << endl;
00182 }
00183
00184
00186
00187
00188 AdminUser::AdminUser(Row &aRow) : User(aRow)
00189 {
00190
00191 }
00192
00193 vector<User *> & AdminUser::userList()
00194 {
00195 Database &db = Database::Instance();
00196 vector<User *> *users = NULL;
00197
00198 Connection *conn = db.getConnection();
00199 Query q = conn->query(QUERY_ADMIN_USERLST);
00200 StoreQueryResult res = q.store();
00201 if (!res.empty()) {
00202 users = new vector<User *>;
00203 users->reserve(res.num_rows());
00204
00205 StoreQueryResult::const_iterator it;
00206 for (it=res.begin(); it != res.end(); it++) {
00207 User *anUser;
00208 Row row = *it;
00209
00210 if (row[KEY_USR_ADMIN] == "1")
00211 anUser = new AdminUser(row);
00212 else
00213 anUser = new NormalUser(row);
00214 assert(anUser);
00215 users->push_back(anUser);
00216 }
00217 }
00218
00219 return *users;
00220 }
00221
00222 bool AdminUser::changeUserPassword(User & anUser, string aPasswd)
00223 {
00224 anUser.setValueForKey(KEY_USR_PASSWD, aPasswd);
00225 return anUser.update();
00226 }
00227
00229
00230 NormalUser::NormalUser() : User()
00231 {
00232
00233 }
00234
00235 NormalUser::NormalUser(Row &aRow) : User(aRow)
00236 {
00237
00238 }
00239
00240 NormalUser::~NormalUser()
00241 {
00242 }
00243
00244 Order * NormalUser::placeOrder() throw (string)
00245 {
00246 if (basket.size() == 0)
00247 throw "Basket must contain at least one product";
00248
00249 Order *newOrder = Order::create(intForKey(KEY_USR_UID), basket);
00250
00251 return newOrder;
00252 }