def login(username, password): # make sure admin with specified username exists admin_object = admin_collection.find_one({'UserName': username}, { 'Password': 1, 'Key': 1 }) if admin_object is None: return Tools.Result(False, Tools.errors('INF')) hash_key = str(admin_object['Key'])[2:-1] encrypted_password = str(admin_object['Password'])[2:-1].encode() cipher_suite = Fernet(hash_key) decrypted_password = str( cipher_suite.decrypt(encrypted_password))[2:-1] if decrypted_password != password: return Tools.Result(False, 'NA') token = Auth.add_token(admin_object['_id']) if token is False: return Tools.Result(False, Tools.errors("FTGT")) response = {'Id': admin_object['_id'], 'Token': token} return Tools.Result(True, Tools.dumps(response))
def resend_activation_code_to_phone_number(phone_number): # validate phone number if re.match(User.Constants.phone_regex, phone_number) is None: return Tools.Result(False, Tools.errors('NA')) # make sure user is registered and in not confirmed status valid = user_collection.find_one({'PhoneNumber': phone_number}, {'_id': 1}) is not None if not valid: return Tools.Result(False, Tools.errors('NA')) # generate an activation code activation_code = User.generate_activation_code() # store new generated code user_collection.update_one({'PhoneNumber': phone_number}, { '$set': { 'Update_at': datetime.now(), 'Code.Code': activation_code, 'Code.Is_Used': False } }) # send code to phone number sending_result = send_code_phone_number(phone_number, activation_code) return sending_result
def update_info(admin_id, username=None, firstname=None, lastname=None): if username is None and firstname is None and lastname is None: return Tools.Result(False, Tools.errors('NA')) # make sure admin exists exists = admin_collection.find_one({'_id': ObjectId(admin_id)}, {'_id': 1}) is not None if not exists: return Tools.Result(False, Tools.errors('INF')) # make sure specified username is unique unique = admin_collection.find_one({'UserName': username}, {'_id': 1}) is None if not unique: return Tools.Result(False, Tools.errors('NA')) updated_values = {} if username is not None: updated_values['Username'] = username if firstname is not None: updated_values['FirstName'] = firstname if lastname is not None: updated_values['LastName'] = lastname admin_collection.update_one({'_id': ObjectId(admin_id)}, {'$set': { **updated_values }}) return Tools.Result(True, 'd')
def modify_category(category_id, row_id=None, title=None, icon_url=None, image_url=None): if row_id is None and title is None and icon_url is None and image_url is None: return Tools.Result(False, Tools.errors('NA')) valid = category_collection.find_one( {'_id': ObjectId(category_id)}, {'_id': 1}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) updating_values = {} if row_id is not None: updating_values['RowId'] = row_id if title is not None: updating_values['Title'] = title if icon_url is not None: updating_values['IconUrl.IconImage'] = icon_url if image_url is not None: updating_values['ImageUrl.ImageUrl'] = image_url category_collection.update_one( {'_id': ObjectId(category_id)}, { '$set': {**updating_values} } ) return Tools.Result(True, 'd')
def unlike_item(item_id, user_id): valid = item_collection.find_one({'_id': ObjectId(item_id)}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) # make sure user did not liked the item before liked_before = item_collection.find_one({ '_id': ObjectId(item_id), 'Likes.UserId': user_id }) is not None if not liked_before: return Tools.Result(False, Tools.errors('INF')) # update the likes item_collection.update_one({'_id': ObjectId(item_id)}, { '$pull': { 'Likes': { 'UserId': user_id } }, '$inc': { 'LikesCount': -1 } }) return Tools.Result(True, 'd')
def get_all_items_by_category(): categories = Category._get_categories() print(categories) items_object = item_collection.find({}, { '_id': 0, 'RowId': 1, 'Title': 1 }) items = [] for item in items_object: items.append(item) if len(items) == 0: return Tools.Result(False, Tools.errors('INF')) items_by_category = {} for category in categories: items_by_category[category['Title']] = [] for item in items: for category in categories: if int(item['RowId']) == int(category['RowId']): items_by_category[category['Title']].append(item['Title']) return Tools.Result(True, items_by_category)
def reset_password(admin_id, prev_password, new_password): # make sure admin exists admin_object = admin_collection.find_one({'_id': ObjectId(admin_id)}, { '_id': 1, 'Key': 1, 'Password': 1 }) if admin_object is None: return Tools.Result(False, Tools.errors('INF')) hash_key = str(admin_object['Key'])[2:-1] encrypted_password = str(admin_object['Password'])[2:-1].encode() cipher_suite = Fernet(hash_key) decrypted_password = str( cipher_suite.decrypt(encrypted_password))[2:-1] if decrypted_password != prev_password: return Tools.Result(False, 'NA') encrypted_password = cipher_suite.encrypt(new_password.encode()) admin_collection.update_one({'_id': ObjectId(admin_id)}, {'$set': { 'Password': encrypted_password }}) return Tools.Result(True, 'd')
def get_all_items(): items_object = item_collection.find({}) items = [] for item in items_object: items.append(item) if len(items) == 0: return Tools.Result(False, Tools.errors('INF')) items = Item._get_gallery_image_urls_for_items(items) for item in items: menu_image_id = item['MenuImageUrl']['MenuImageId'] item.pop('MenuImageUrl') item[ 'MenuImageUrl'] = 'https://cafe-art-backend.liara.run/item/menu/image/{}'.format( menu_image_id) item_image_id = item['ItemImageUrl']['ItemImageId'] item.pop('ItemImageUrl') item[ 'ItemImageUrl'] = 'https://cafe-art-backend.liara.run/item/item/image/{}'.format( item_image_id) return Tools.Result(True, Tools.dumps(items))
def comment_on_item(item_id, user_id, comment, rate): valid = item_collection.find_one({'_id': ObjectId(item_id)}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) # # make sure user did not comment on the item before # commented_before = item_collection.find_one({'_id': ObjectId(item_id), 'Comments.UserId': user_id}) is not None # if commented_before: # return Tools.Result(False, Tools.errors('IAE')) # update the comments item_collection.update_one({'_id': ObjectId(item_id)}, { '$push': { 'Comments': { 'CommentId': ObjectId(), 'UserId': user_id, 'Comment': comment, 'Rate': rate, 'Seen': False, 'Created_at': datetime.now() } } }) return Tools.Result(True, 'd')
def get_item(item_id): item_object = item_collection.find_one({'_id': ObjectId(item_id)}, { 'RowId': 1, 'CategoryName': 1, 'Title': 1, 'Description': 1, 'MenuImageUrl': 1, 'ItemImageUrl': 1, 'Likes': 1, 'Price': 1 }) if item_object is None: return Tools.Result(False, Tools.errors('INF')) menu_image_id = item_object['MenuImageUrl']['MenuImageId'] item_object.pop('MenuImageUrl') item_object[ 'MenuImageUrl'] = 'https://cafe-art-backend.liara.run/item/menu/image/{}'.format( menu_image_id) item_image_id = item_object['ItemImageUrl']['ItemImageId'] item_object.pop('ItemImageUrl') item_object[ 'ItemImageUrl'] = 'https://cafe-art-backend.liara.run/item/item/image/{}'.format( item_image_id) gallery_images_urls = Item._get_gallery_image_urls(item_id) item_object['GalleryUrls'] = gallery_images_urls return Tools.Result(True, Tools.dumps(item_object))
def get_category_icon(icon_id): category_object = category_collection.find_one({'IconUrl.IconId': icon_id}, {'IconUrl': 1}) if category_object is None: return Tools.Result(False, Tools.errors('INF')) return category_object['IconUrl']['IconImage']
def unlike_image_gallery(item_id, user_id, gallery_image_id): valid = item_collection.find_one({'_id': ObjectId(item_id)}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) gallery = item_collection.find_one( { '_id': ObjectId(item_id), 'Gallery': { '$elemMatch': { 'Id': ObjectId(gallery_image_id) } } }, { '_id': 0, 'Gallery': 1 }) found = False for images in gallery['Gallery']: if str(images['Id']) == gallery_image_id: for like in images['Likes']: if like['UserId'] == user_id: found = True if not found: return Tools.Result(False, Tools.errors('NA')) # update the likes item_collection.update_one({'_id': ObjectId(item_id)}, { '$dec': { 'Gallery.$[elem].LikesCount': -1 }, '$pull': { 'Gallery.$[elem].Likes': { 'UserId': user_id } } }, array_filters=[{ 'elem.Id': ObjectId(gallery_image_id) }]) return Tools.Result(True, 'd')
def get_category_image(image_id): category_object = category_collection.find_one( {'ImageUrl.ImageId': image_id}, {'ImageUrl': 1}) if category_object is None: return Tools.Result(False, Tools.errors('INF')) return category_object['ImageUrl']['ImageUrl']
def get_item_menu_image(image_id): item_object = item_collection.find_one( {'MenuImageUrl.MenuImageId': image_id}, {'MenuImageUrl': 1}) if item_object is None: return Tools.Result(False, Tools.errors('INF')) return item_object['MenuImageUrl']['MenuImage']
def get_event_image(image_id): event = event_collection.find_one({'ImageUrl.ImageId': image_id}, {'ImageUrl': 1}) if event is None: return Tools.Result(False, Tools.errors('INF')) return event['ImageUrl']['Image']
def get_gallery_images(item_id): item = item_collection.find_one({'_id': ObjectId(item_id)}, {'Gallery': 1}) if item is None: return Tools.Result(False, Tools.errors('INF')) return Tools.Result(True, Tools.dumps(item['Gallery']))
def get_info(admin_id): # make sure admin exists info = admin_collection.find_one({'_id': ObjectId(admin_id)}) if info is None: return Tools.Result(False, Tools.errors('INF')) return Tools.Result(True, Tools.dumps(info))
def modify_item(item_id, row_id=None, category_name=None, title=None, description=None, price=None, menu_image_url=None, item_image_url=None): # make sure at least on attribute is not null if row_id is None and category_name is None and title is None and price is None and menu_image_url is None and item_image_url is None and description is None: return Tools.Result(False, Tools.errors('NA')) if (row_id is None and category_name is not None) or (row_id is not None and category_name is None): return Tools.Result(False, Tools.errors('NA')) valid = item_collection.find_one({'_id': ObjectId(item_id)}, {'_id': 1}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) updating_values = {} if title is not None: updating_values['Title'] = title if row_id is not None: updating_values['RowId'] = str(row_id) updating_values['CategoryName'] = category_name if price is not None: updating_values['Price'] = price if menu_image_url is not None: updating_values['MenuImageUrl.MenuImage'] = menu_image_url if item_image_url is not None: updating_values['ItemImageUrl.ItemImage'] = item_image_url if description is not None: updating_values['Description'] = description item_collection.update_one({'_id': ObjectId(item_id)}, {'$set': { **updating_values }}) return Tools.Result(True, 'd')
def get_activation_code(phone_number): user_object = user_collection.find_one({'PhoneNumber': phone_number}, {'Code': 1}) if user_object is None: return Tools.Result(False, Tools.errors('INF')) return Tools.Result(True, user_object['Code']['Code'])
def download(file_id): try: file = files_collection.find_one({'_id': ObjectId(file_id)}, {"Name", "MimeType"}) if file is None: raise Exception(Tools.errors("INF")) path = FileTools.save_file_path(file["Name"]) return FileResponse(path, media_type=file['MimeType']) except Exception as ex: return Tools.Result(False, ex.args)
def get_comments_on_item(item_id): item_object = item_collection.find_one({'_id': ObjectId(item_id)}, {'Comments': 1}) if item_object is None: return Tools.Result(False, Tools.errors('INF')) comments = item_object['Comments'] return Tools.Result(True, Tools.dumps(comments))
def delete_item(item_id): valid = item_collection.find_one({'_id': ObjectId(item_id)}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) item_collection.delete_one({'_id': ObjectId(item_id)}) return Tools.Result(True, 'd')
def delete_event(event_id): valid = event_collection.find_one({'_id': ObjectId(event_id)}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) event_collection.delete_one({'_id': ObjectId(event_id)}) return Tools.Result(True, 'd')
def delete_category(row_id): valid = category_collection.find_one( {'RowId': row_id}, {'_id': 1}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) category_collection.delete_one({'RowId': row_id}) return Tools.Result(True, 'd')
def delete_notification(notification_id): valid = notification_collection.find_one( {'_id': ObjectId(notification_id)}, {'_id': 1}) is not None if not valid: return Tools.Result(False, Tools.errors('INF')) notification_collection.delete_one({'_id': ObjectId(notification_id)}) return Tools.Result(True, 'd')
def login(phone_number): # validate phone number if User.validate_phone(phone_number) is None: return Tools.Result(False, Tools.errors('NA')) # make sure user with specified phone number is registered and confirmed user_object = user_collection.find_one( {'PhoneNumber': phone_number # 'Status': 'Confirm' }, {'_id': 1}) if user_object is None: return Tools.Result(False, Tools.errors('INF')) # generate activation code activation_code = User.generate_activation_code() # send activation code to phone number activation_result = send_code_phone_number(phone_number, activation_code) # parse result result_dict = json.loads(activation_result) # check whether sending sms was successful successful = result_dict['State'] # if it failed -> forward the result if not successful: return activation_result user_collection.update_one( {'PhoneNumber': phone_number}, {'$set': { 'Code.Code': activation_code, 'Code.Is_Used': False }}) return Tools.Result(True, 'L')
def delete_image(image_id): result = cafe_collection.update_one( {}, {'$pull': { 'Images': { 'ImageId': image_id } }}) if result.modified_count == 0: return Tools.Result(False, Tools.errors('INF')) else: return Tools.Result(True, 'd')
def login_as_guest(uuid): guest_id = ObjectId() token = Auth.add_token(str(guest_id)) if not token: return Tools.Result(False, Tools.errors("FTGT")) user_collection.insert_one({'_id': guest_id, 'Uuid': uuid}) response = {'Id': str(guest_id), 'Token': token} return Tools.Result(True, Tools.dumps(response))
def add_category(row_id, title, icon_url, image_url): # make sure row id is unique is_unique = category_collection.find_one( {'RowId': row_id}, {'_id': 1}) is None if not is_unique: return Tools.Result(False, Tools.errors('IAE')) category_collection.insert_one( Category(row_id, title, icon_url, image_url, datetime.now()).__dict__) return Tools.Result(True, 'd')
def get_gallery_image(gallery_image_id): item = item_collection.find_one({'Gallery.Id': gallery_image_id}, {'Gallery': 1}) if item is None: return Tools.Result(False, Tools.errors('INF')) response_gallery_image = "" for gallery_image in item['Gallery']: if gallery_image['Id'] == gallery_image_id: response_gallery_image = gallery_image['ImageUrl'] return response_gallery_image