phi/src/phi/api/rest.py

132 lines
3.3 KiB
Python
Raw Normal View History

2017-12-21 13:44:54 +01:00
from aiohttp.web import json_response, View
2022-02-01 23:30:49 +01:00
from aiohttp.web import (
HTTPNotFound,
HTTPUnprocessableEntity,
HTTPServerError,
HTTPNoContent,
HTTPBadRequest,
HTTPCreated,
)
2017-12-16 23:03:03 +01:00
2017-12-21 13:44:54 +01:00
from phi.logging import get_logger
# from phi.api.utils import serialize
from phi.async_ldap.model import User
2022-02-01 23:30:49 +01:00
from phi.exceptions import (
PhiEntryDoesNotExist,
PhiUnexpectedRuntimeValue,
PhiCannotExecute,
)
2017-12-16 23:03:03 +01:00
2017-12-21 13:44:54 +01:00
log = get_logger(__name__)
2017-12-21 13:44:54 +01:00
2020-08-29 20:14:55 +02:00
class UserView(View):
2022-02-01 23:30:49 +01:00
def get_log(self):
return self.request.app["log"]
def get_uid(self):
try:
return self.request.match_info["uid"]
except KeyError:
raise HTTPUnprocessableEntity
async def find_user(self, uid):
log = self.get_log()
2017-12-27 11:02:38 +01:00
2022-02-01 23:30:49 +01:00
try:
user = await self.request.app["users"].search(uid)
log.info("Found user %s", user)
except PhiEntryDoesNotExist as e:
log.info(e)
raise HTTPNotFound
2017-12-21 13:44:54 +01:00
2022-02-01 23:30:49 +01:00
return user
2017-12-21 13:44:54 +01:00
2022-02-01 23:30:49 +01:00
async def get(self):
log = self.get_log()
log.debug(f"{self.__class__.__name__}.get")
uid = self.get_uid()
user = await self.find_user(uid)
2017-12-21 13:44:54 +01:00
2020-08-29 20:14:55 +02:00
result = await user.describe()
2022-02-01 23:30:49 +01:00
log.debug("Returning result %s", result)
2020-08-29 20:14:55 +02:00
return json_response(result)
2022-02-01 23:30:49 +01:00
async def post(self):
log = self.get_log()
log.debug(f"{self.__class__.__name__}.post")
uid = self.get_uid()
user = await self.find_user(uid)
try:
user = await self.request.app["users"].search(uid)
log.info("Found user %s", user)
except PhiEntryDoesNotExist as e:
log.debug(e)
raise HTTPNotFound(text=str(e))
except PhiUnexpectedRuntimeValue as e:
log.error("Exception: %s", e)
raise HTTPServerError
body = await self.request.json()
for k, v in body.items():
try:
user[k] = v
except PhiCannotExecute as e:
err = str(e)
log.error(err)
raise HTTPBadRequest(text=err)
try:
await user.modify()
except Exception as e:
log.error("Exception: %s", e)
raise HTTPNoContent
async def put(self):
log = self.get_log()
log.debug(f"{self.__class__.__name__}.put")
uid = self.get_uid()
user = User(self.request.app["ldap_client"], uid)
body = await self.request.json()
try:
for k, v in body.items():
user[k] = v
log.debug(f"Saving: {user}")
await user.save()
except PhiCannotExecute as e:
err = str(e)
log.error(err)
raise HTTPBadRequest(text=err)
log.info(f"New user saved: {user}")
raise HTTPCreated
async def delete(self):
log = self.get_log()
log.debug(f"{self.__class__.__name__}.delete")
uid = self.get_uid()
try:
user = await self.request.app["users"].search(uid)
log.info("Found user %s", user)
await user.delete()
except PhiEntryDoesNotExist as e:
log.debug(e)
raise HTTPNotFound(text=str(e))
except PhiUnexpectedRuntimeValue as e:
log.error("Exception: %s", e)
raise HTTPServerError
raise HTTPNoContent