Repository navigation
Expand file tree
/
Copy pathWalletManagementAPI.py
More file actions
186 lines (127 loc) · 5.66 KB
/
Copy pathWalletManagementAPI.py
File metadata and controls
186 lines (127 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#!/usr/bin/env python3
from flask import Flask, request, jsonify
from authenticator import Authenticator
from collections import defaultdict
from datetime import datetime
from functools import wraps
app = Flask(__name__)
authenticator = Authenticator(credentials_file = "user.txt", secret_key="your_secret_key")
#Define authentication middleware
def token_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
return jsonify({'error':'Token is missing'}),401
username = authenticator.validate_token(token)
if not username:
return jsonify({'error':'Invalid token'}),401
return f(*args,**kwargs)
return decorated_function
class Auth:
@app.route('/api/auth/signup', methods =['POST'])
def signup():
data = request.json
# Validation
if not all(key in data for key in ('username', 'email', 'password')):
return jsonify({'error':'Missing credentials'}),400
username = data.get('username')
email = data.get('email')
password = data.get('password')
success, message = authenticator.register_user(username, email,password)
if success:
return jsonify({'message':message}),201
else:
return jsonify({'error': message}), 400
@app.route('/api/auth/login', methods = ['POST'])
def login():
data = request.json
#validation
if not all(key in data for key in ('username', 'password')):
return jsonify({'error':'Missing Credentials'}),400
username = data.get('username')
password = data.get('password')
success, token_or_message = authenticator.login(username, password)
if success:
return jsonify({'token': token_or_message}), 200
else:
return jsonify({'error': token_or_message}), 401
class Expense_Management:
# Dumm data to simpulate user expenses
user_expenses=[]
@app.route('/api/expenses', methods=['POST'])
@token_required
def add_expenses():
# Get expensed data from request body
data = request.json
# Validation
if not all(key in data for key in ('title', 'date','amount', 'category')):
return jsonify({'error': 'Missing required field'}),400
title = data.get('title')
date = data.get('date')
amount = data.get('amount')
category = data.get('category')
# Add expense to the list
user_expenses.append({
'title':title, 'date':date, 'amount':amount, 'category':category
})
return jsonify({'message':'Expense added succesfully'}), 201
@app.route('/api/expenses', methods = ['GET'])
@token_required
def get_expenses():
# Paginate expenses eg 10 expenses per page
page = request.args.get('page', default=1, type=int)
per_page = request.args.get('per_page', default=10, type=int)
start_index = (page-1)* per_page
end_index = start_index + per_page
paginated_expenses = user_expenses[start_index:end_index]
return jsonify({'exepenes': paginated_expenses}),200
@app.route('/api/expenses/grouped', methods=['GET'])
@token_required
def get_grouped_expenses():
grouped_expenses = defaultdict(list)
for expenses in user_expenses:
grouped_expenses[expenses['category']].append(expenses)
# optinonllay filer by month
month = request.args.get('month')
if month:
filtered_expenses = {}
for category, expenses in grouped_expenses.items():
filtered_expenses[category]= [expense for expense in expenses if expense['data'].startswith(month)]
grouped_expenses = filtered_expenses
return jsonify({'grouped_expenses': dict(grouped_expenses)}),200
@app.route('/api/expenses/<int:category_id>/monthly')
@token_required
def get_monthly_expenses(category_id):
category_exepenses = [expense for expense in user_expenses if expense['category']==category_id]
monthly_expenses = defaultdict(lambda:defaultdict(int))
for expense in category_exepenses:
date = datetime.strptime(expense['date'], '%Y-%m-%d')
month = date.strftime('%Y-%m')
day=date.day
monthly_expenses[month][day] += expense['amount']
return jsonify({'monthly_expenses': dict(monthly_expenses)}),200
class Expense_Categories_Management:
expense_categories = []
@app.route('/api/categoies', methods=['GET'])
@token_required
def get_categories():
return jsonify({'categories': expense_categories}), 200
@app.route('/api/categories', methods=['POST'])
@token_required
def add_category():
# Get category data from request body
data = request.json
category_name = data.get('name')
# add category to list
expense_categories.append(category_name)
return jsonify({'message': 'Category added succesfully'}), 201
@app.route('/api/categories/<int:category_id>', methods=['DELETE'])
@token_required
def delete_category(categroy_id):
# check if category_id is valid
if categroy_id < 0 or categroy_id >=len(expense_categories):
return jsonify({'error': 'Invalid category ID'}), 400
# Delete category
del expense_categories[categroy_id]
return jsonify({'message': 'Category delete successfully'}), 200