diff --git a/src/packetserver/client/objects.py b/src/packetserver/client/objects.py new file mode 100644 index 0000000..7a73f3b --- /dev/null +++ b/src/packetserver/client/objects.py @@ -0,0 +1,80 @@ +import datetime + +from packetserver.client import Client +from packetserver.common import Request, Response, PacketServerConnection +from typing import Union, Optional +from uuid import UUID, uuid4 +import os.path + + + +class ObjectWrapper: + def __init__(self, data: dict): + for i in ['name', 'uuid_bytes', 'binary', 'private', 'created_at', 'modified_at', 'data']: + if i not in data.keys(): + raise ValueError("Data dict was not an object dictionary.") + self.obj_data = data + + @property + def size(self) -> int: + return len(self.obj_data['data']) + + @property + def created(self) -> datetime.datetime: + return datetime.datetime.fromisoformat(self.obj_data['created_at']) + + @property + def modified(self) -> datetime.datetime: + return datetime.datetime.fromisoformat(self.obj_data['modified_at']) + + @property + def uuid(self) -> UUID: + return UUID(bytes=self.obj_data['uuid_bytes']) + + @property + def private(self) -> bool: + return self.obj_data['private'] + + @property + def binary(self) -> bool: + return self.obj_data['binary'] + + @property + def data(self) -> Union[str, bytes]: + if self.binary: + return self.obj_data['data'] + else: + return self.obj_data['data'].decode() + + +def post_object(client: Client, bbs_callsign: str, name:str, data: Union[str, bytes, bytearray], private=True) -> UUID: + if type(data) in [bytes, bytearray]: + data = bytes(data) + binary = True + else: + binary = False + data = str(data).encode() + + req = Request.blank() + req.path = "object" + req.payload = {'name': name, 'data': data, 'binary': binary, 'private': private} + req.method = Request.Method.POST + response = client.send_receive_callsign(req, bbs_callsign) + if response.status_code != 201: + raise RuntimeError(f"Posting object failed: {response.status_code}: {response.payload}") + return UUID(response.payload) + +def post_file(client: Client, bbs_callsign: str, file_path: str, private=True, name: str = None, binary=True) -> UUID: + if name is None: + obj_name = os.path.basename(file_path) + else: + obj_name = os.path.basename(str(name)) + if binary: + mode = 'rb' + else: + mode = 'r' + data = open(file_path, mode).read() + return post_object(client, bbs_callsign, obj_name, data, private=private) + +def get_object_by_uuid(): + # TODO get object uuid \ No newline at end of file