PopufareAPI.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #!/usr/bin/python3
  2. #
  3. # Copyright (c) 2019 Clementine Computing LLC.
  4. #
  5. # This file is part of PopuFare.
  6. #
  7. # PopuFare is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # PopuFare is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with PopuFare. If not, see <https://www.gnu.org/licenses/>.
  19. #
  20. ## WORK IN PROGRESS
  21. import json
  22. import mysql.connector
  23. import time
  24. import datetime
  25. #conn = mysql.connector.connect(user='bus', password='bus', host='localhost', database='busdb', port=3306)
  26. conn = mysql.connector.connect(user='busapi', password='bus', host='localhost', database='busdb', port=5506)
  27. Function = [
  28. "User",
  29. "Card",
  30. "Pass",
  31. "Log",
  32. "PricePoints",
  33. "AdminGetCard", "AdminGetCards", "AdminGetPass", "AdminGetUser",
  34. "AdminGetAdmin", "AdminGetPassesOnCard", "AdminGetPendingQueue", "AdminProcessPendingQueue",
  35. "AdminRemovePendingQueue", "AdminCreateCardBlock", "AdminCreateCard", "AdminSetUser",
  36. "AdminSetAdmin", "AdminAddPass", "AdminAddCard", "AdminAddUser",
  37. "AdminAddAdmin", "AdminRemovePass", "AdminRemovePasses", "AdminRemoveCard",
  38. "AdminRemoveUser", "AdminRemoveAdmin", "AdminTransferCard", "AdminTransferPass",
  39. "AdminGetPassOptions", "AdminAddCardToUser", "AdminRemoveCardFromUser", "AdminGetAdminPermissions",
  40. "AdminAddAdminPermissions", "AdminRemoveAdminPermissions", "AdminAddAdminApiPermissions", "AdminRemoveAdminApiPermissions",
  41. "AdminSetAdminApiPermissions", "AdminGetCustomCard", "AdminGetAdmins", "AdminSearchCards",
  42. "AdminSearchUsers", "AdminSearchAdmins"]
  43. PASS_FIELDS = ["logical_card_id", "issued", "activated", "deactivated", "firstused", "lastused",
  44. "nrides_orig", "nrides_remain", "nday_orig", "nday_expiration",
  45. "expired", "rule", "queue_order", "comment", "paytype" ]
  46. CARD_FIELDS = ["mag_token", "rfid_token", "comment", "userid", "issued", "deactivated", "lastused",
  47. "firstused", "group_id", "issuetype"]
  48. USER_FIELDS = ["username", "comment", "first_name", "last_name", "phone",
  49. "email", "address", "city", "state", "zip", "passwordhash",
  50. "shipping_address", "shipping_city", "shipping_state", "shipping_zip",
  51. "shipping_name", "shipping_country_code", "shipping_country_name"]
  52. def UserInfo(db, ctx):
  53. res = {}
  54. userid = -1
  55. if ("userid" in ctx):
  56. userid = ctx["userid"]
  57. pass_fields = PASS_FIELDS.copy()
  58. card_fields = CARD_FIELDS.copy()
  59. user_fields = USER_FIELDS.copy()
  60. res["userid"] = userid
  61. cursor = db.cursor()
  62. ## fill in user data
  63. ##
  64. res["user"] = {}
  65. fields = USER_FIELDS.copy()
  66. query = "select " + ",".join(fields) + " from users where userid = %s"
  67. cursor.execute(query, [userid])
  68. row = cursor.fetchone()
  69. for idx,f in enumerate(pass_fields):
  70. res["user"][f] = row[idx]
  71. ## go through each card and fill in card data and pass data
  72. ##
  73. res["card"] = []
  74. query = "select logical_card_id from user_card where userid = %s and active = 1 order by logical_card_id asc"
  75. card_cursor = db.cursor()
  76. card_cursor.execute(query, [userid])
  77. rows = card_cursor.fetchall()
  78. for row in rows:
  79. card_res = Card(db, {"action":"get", "logical_card_id": row[0]})
  80. card_res["pass"] = []
  81. ## finally, go through each pass
  82. ##
  83. pass_query = "select user_pass_id from user_pass where logical_card_id = %s and active = 1 and expired = 0 order by queue_order asc"
  84. pass_cursor = db.cursor()
  85. pass_cursor.execute(pass_query, [card_res["logical_card_id"]])
  86. pass_rows = pass_cursor.fetchall()
  87. for pass_row in pass_rows:
  88. pass_res = Pass(db, {"action":"get", "user_pass_id":pass_row[0]})
  89. card_res["pass"].append(pass_res)
  90. res["card"].append(card_res)
  91. return res
  92. def Pass(db, ctx):
  93. res = {}
  94. passid = -1
  95. if ("user_pass_id" in ctx):
  96. passid = ctx["user_pass_id"]
  97. pass_fields = PASS_FIELDS.copy()
  98. cursor = db.cursor()
  99. fields = pass_fields.copy()
  100. field_vals = []
  101. if (ctx["action"] == "get"):
  102. query = "select " + ",".join(pass_fields) + " from user_pass where user_pass_id = %s"
  103. cursor.execute(query, [passid])
  104. row = cursor.fetchone()
  105. res["user_pass_id"] = passid
  106. for idx,f in enumerate(pass_fields):
  107. if isinstance(row[idx], datetime.datetime):
  108. res[f] = row[idx].strftime("%Y-%M-%d %H:%m:%S")
  109. else:
  110. res[f] = row[idx]
  111. elif (ctx["action"] == "add"):
  112. fields.append("active")
  113. for f in pass_fields:
  114. if f in ctx: field_vals.append(ctx[f])
  115. else: field_vals.append(None)
  116. field_vals.append(1)
  117. query = "insert into user_pass (" + ",".join(fields) + ") values (" + ",".join(["%s"]*len(fields)) + ")"
  118. cursor.execute(query, field_vals)
  119. res["user_pass_id"] = cursor.lastrowid
  120. elif (ctx["action"] == "update"):
  121. update_field = []
  122. update_val = []
  123. for f in pass_fields:
  124. if f in ctx:
  125. update_field.append(f + "= %s")
  126. update_val.append(ctx[f])
  127. update_val.append(passid)
  128. query = "update user_pass set " + ",".join(update_field) + " where user_pass_id = %s"
  129. cursor.execute(query, update_val)
  130. res["user_pass_id"] = passid
  131. elif (ctx["action"] == "delete"):
  132. query = "delete from user_pass where user_pass_id = %s"
  133. cursor.execute(query, [passid])
  134. db.commit()
  135. return res
  136. def Card(db, ctx):
  137. card_fields = CARD_FIELDS.copy()
  138. res = {}
  139. cardid = -1
  140. if ("logical_card_id" in ctx):
  141. cardid = ctx["logical_card_id"]
  142. cursor = db.cursor()
  143. fields = card_fields.copy()
  144. field_vals = []
  145. if (ctx["action"] == "get"):
  146. query = "select " + ",".join(card_fields) + " from user_card where logical_card_id = %s"
  147. cursor.execute(query, [cardid])
  148. row = cursor.fetchone()
  149. res["logical_card_id"] = cardid
  150. for idx,f in enumerate(card_fields):
  151. if isinstance(row[idx], datetime.datetime):
  152. res[f] = row[idx].strftime("%Y-%M-%d %H:%m:%S")
  153. else:
  154. res[f] = row[idx]
  155. elif (ctx["action"] == "add"):
  156. fields.append("active")
  157. for f in card_fields:
  158. if f in ctx: field_vals.append(ctx[f])
  159. else: field_vals.append(None)
  160. field_vals.append(1)
  161. query = "insert into user_card (" + ",".join(fields) + ") values (" + ",".join(["%s"]*len(fields)) + ")"
  162. cursor.execute(query, field_vals)
  163. res["logical_card_id"] = cursor.lastrowid
  164. elif (ctx["action"] == "update"):
  165. update_field = []
  166. update_val = []
  167. for f in card_fields:
  168. if f in ctx:
  169. update_field.append(f + "= %s")
  170. update_val.append(ctx[f])
  171. update_val.append(cardid)
  172. query = "update user_card set " + ",".join(update_field) + " where logical_card_id = %s"
  173. cursor.execute(query, update_val)
  174. res["logical_card_id"] = cardid
  175. elif (ctx["action"] == "delete"):
  176. query = "delete from user_card where logical_card_id = %s"
  177. cursor.execute(query, [cardid])
  178. elif (ctx["action"] == "search"):
  179. query = "select logical_card_id from user_card where "
  180. if "mag_token" in ctx:
  181. query += " mag_token like %s "
  182. field_vals.append( '%' + ctx["mag_token"])
  183. if "rfid_token" in ctx:
  184. if len(field_vals)>0: query += " and "
  185. query += " rfid_token like %s "
  186. field_vals.append( '%' + ctx["rfid_token"])
  187. query_limit = " "
  188. if "limit" in ctx:
  189. query_limit = " limit %s "
  190. search_vals.append(ctx["limit"])
  191. query += query_limit
  192. cursor.execute(query, field_vals)
  193. res["cardids"] = []
  194. rows = cursor.fetchall()
  195. for row in rows:
  196. res["cardids"].append(row[0])
  197. db.commit()
  198. return res
  199. def User(db, ctx):
  200. user_fields = USER_FIELDS.copy()
  201. res = {}
  202. cursor = db.cursor()
  203. fields = user_fields.copy()
  204. user_vals = []
  205. userid = -1
  206. if "userid" in ctx: userid = ctx["userid"]
  207. if (ctx["action"] == "get"):
  208. query = "select " + ",".join(user_fields) + " from users where userid = %s"
  209. cursor.execute(query, [userid])
  210. row = cursor.fetchone()
  211. res["userid"] = userid
  212. for idx,f in enumerate(user_fields):
  213. if isinstance(row[idx], datetime.datetime):
  214. res[f] = row[idx].strftime("%Y-%M-%d %H:%m:%S")
  215. else:
  216. res[f] = row[idx]
  217. elif (ctx["action"] == "add"):
  218. fields.append("active")
  219. fields.append("created")
  220. for f in user_fields:
  221. if f in ctx: user_vals.append(ctx[f])
  222. else: user_vals.append(None)
  223. user_vals.append(1)
  224. user_vals.append(time.strftime('%Y-%m-%d %H:%M:%S'))
  225. query = "insert into users (" + ",".join(fields) + ") values (" + ",".join(["%s"]*len(fields)) + ")"
  226. cursor.execute(query, user_vals)
  227. res["userid"] = cursor.lastrowid
  228. elif (ctx["action"] == "update"):
  229. update_field = []
  230. update_val = []
  231. for f in user_fields:
  232. if f in ctx:
  233. update_field.append(f + "= %s")
  234. update_val.append(ctx[f])
  235. update_val.append(userid)
  236. query = "update users set " + ",".join(update_field) + " where userid = %s"
  237. cursor.execute(query, update_val)
  238. res["userid"] = userid
  239. elif (ctx["action"] == "delete"):
  240. query = "delete from users where userid = %s"
  241. cursor.execute(query, [userid])
  242. elif (ctx["action"] == "search"):
  243. res["userids"] = []
  244. res["userid"] = userid
  245. search_field = []
  246. search_val = []
  247. for f in user_fields:
  248. if f in ctx:
  249. search_field.append(f + " like %s")
  250. search_val.append('%' + ctx[f] + '%')
  251. query_limit = " "
  252. if "limit" in ctx:
  253. query_limit = " limit %s "
  254. search_vals.append(ctx["limit"])
  255. query = "select userid from users where " + " and ".join(search_field) + query_limit
  256. cursor.execute(query, search_vals)
  257. rows = cursor.fetchall()
  258. for row in rows:
  259. res["userids"].append(row[0])
  260. db.commit()
  261. return res
  262. def main(db):
  263. print("main")
  264. print("---------")
  265. print("---------")
  266. print("---------")
  267. res = User(db, {"action":"add", "username":"abe" })
  268. print("user.add:", res)
  269. res = User(db, {"action":"update", "username":"abeabe", "userid":res["userid"]})
  270. print("user.update:", res)
  271. res = User(db, {"action":"get", "userid":res["userid"]})
  272. print("user.get:", res)
  273. res = User(db, {"action":"delete", "userid": res["userid"]})
  274. print("user.delete:", res)
  275. print("---------")
  276. print("---------")
  277. print("---------")
  278. res = Card(db, {"action":"get", "logical_card_id":1})
  279. print("card.get:", res)
  280. res = Card(db, {"action":"add", "mag_token":"2:1234", "rfid_token":"26:20:415", "comment":"testing api", "userid":1})
  281. print("card.add:", res)
  282. res = Card(db, {"action":"update", "mag_token":"2:9234", "logical_card_id":res["logical_card_id"]})
  283. print("card.update:", res)
  284. res = Card(db, {"action":"delete", "logical_card_id":res["logical_card_id"]})
  285. print("card.delete:", res)
  286. print("---------")
  287. print("---------")
  288. print("---------")
  289. res = Pass(db, {"action":"get", "user_pass_id":11})
  290. print("pass.get:", res)
  291. res = Pass(db, {"action":"add", "logical_card_id":1, "queue_order":9, "rule":"TEST-ORG-NDAY", "nday_orig":3})
  292. print("pass.add:", res)
  293. res = Pass(db, {"action":"update", "user_pass_id":res["user_pass_id"], "queue_order":10, "rule":"TEST-ORG-NDAY", "nday_orig":5})
  294. print("pass.update:", res)
  295. res = Pass(db, {"action":"delete", "user_pass_id":res["user_pass_id"]})
  296. print("pass.delete:", res)
  297. print("---------")
  298. print("---------")
  299. print("---------")
  300. res = UserInfo(db, {"userid":348})
  301. print("userinfo:", json.dumps(res, indent=2))
  302. if __name__ == "__main__":
  303. main(conn)