-
Notifications
You must be signed in to change notification settings - Fork 60
Expand file tree
/
Copy pathserver.py
More file actions
123 lines (101 loc) · 4.19 KB
/
Copy pathserver.py
File metadata and controls
123 lines (101 loc) · 4.19 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
from sanic import Sanic, response
from asyncpg import create_pool
import os
from dotenv import load_dotenv
app = Sanic("EmployeeManagementApp")
load_dotenv()
DB_URL = os.getenv("DATABASE_URL")
DB_CONFIG = {
"dsn": DB_URL,
}
@app.listener("before_server_start")
async def setup_db(app, loop):
app.ctx.db_pool = await create_pool(**DB_CONFIG, loop=loop)
@app.listener("after_server_stop")
async def close_db(app, loop):
await app.ctx.db_pool.close()
@app.route("/employees", methods=["POST"])
async def add_employee(request):
data = request.json
async with app.ctx.db_pool.acquire() as connection:
await connection.execute(
"INSERT INTO employees (first_name, last_name, email, position, salary) VALUES ($1, $2, $3, $4, $5)",
data["first_name"], data["last_name"], data["email"], data["position"], data["salary"]
)
return response.json({"status": "Employee added"}, status=201)
@app.route("/employees", methods=["GET"])
async def get_employees(request):
async with app.ctx.db_pool.acquire() as connection:
rows = await connection.fetch("SELECT * FROM employees")
employees = [{"id": row["id"], "first_name": row["first_name"], "last_name": row["last_name"],
"email": row["email"], "position": row["position"], "salary": row["salary"],
"date_hired": row["date_hired"].isoformat()} for row in rows]
return response.json({"employees": employees})
@app.route("/employees/<employee_id>", methods=["GET"])
async def get_employee(request, employee_id):
try:
employee_id = int(employee_id)
except ValueError:
return response.json({"status": "Invalid employee ID"}, status=400)
async with app.ctx.db_pool.acquire() as connection:
row = await connection.fetchrow("SELECT * FROM employees WHERE id = $1", employee_id)
if row is None:
return response.json({"status": "Employee not found"}, status=404)
employee = {
"id": row["id"],
"first_name": row["first_name"],
"last_name": row["last_name"],
"email": row["email"],
"position": row["position"],
"salary": row["salary"],
"date_hired": row["date_hired"].isoformat() if row["date_hired"] else None
}
return response.json({"employee": employee})
@app.route("/employees/<employee_id>", methods=["PUT"])
async def update_employee(request, employee_id):
try:
employee_id = int(employee_id)
except ValueError:
return response.json({"status": "Invalid employee ID"}, status=400)
updated_data = request.json
required_fields = ["first_name", "last_name", "email", "position", "salary"]
for field in required_fields:
if field not in updated_data:
return response.json({"status": f"Missing field: {field}"}, status=400)
async with app.ctx.db_pool.acquire() as connection:
result = await connection.execute(
"""
UPDATE employees
SET first_name = $1,
last_name = $2,
email = $3,
position = $4,
salary = $5
WHERE id = $6
""",
updated_data["first_name"],
updated_data["last_name"],
updated_data["email"],
updated_data["position"],
float(updated_data["salary"]),
employee_id
)
if result == "UPDATE 0":
return response.json({"status": "Employee not found"}, status=404)
return response.json({"status": "Employee updated"})
# Function to delete an employee
@app.route("/employees/<employee_id>", methods=["DELETE"])
async def delete_employee(request, employee_id):
try:
employee_id = int(employee_id)
except ValueError:
return response.json({"status": "Invalid employee ID"}, status=400)
async with app.ctx.db_pool.acquire() as connection:
result = await connection.execute(
"DELETE FROM employees WHERE id=$1", employee_id
)
if result == "DELETE 0":
return response.json({"status": "Employee not found"}, status=404)
return response.json({"status": "Employee deleted"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)