Beispiel #1
0
    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))
Beispiel #2
0
    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
Beispiel #3
0
    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')
Beispiel #4
0
    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')
Beispiel #5
0
    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')
Beispiel #6
0
    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)
Beispiel #7
0
    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')
Beispiel #8
0
    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))
Beispiel #9
0
    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')
Beispiel #10
0
    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))
Beispiel #11
0
    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']
Beispiel #12
0
    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')
Beispiel #13
0
    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']
Beispiel #14
0
    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']
Beispiel #15
0
    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']
Beispiel #16
0
    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']))
Beispiel #17
0
    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))
Beispiel #18
0
    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')
Beispiel #19
0
    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'])
Beispiel #20
0
 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)
Beispiel #21
0
    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))
Beispiel #22
0
    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')
Beispiel #23
0
    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')
Beispiel #24
0
    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')
Beispiel #25
0
    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')
Beispiel #26
0
    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')
Beispiel #27
0
    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')
Beispiel #28
0
    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))
Beispiel #29
0
    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')
Beispiel #30
0
    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