diff --git a/.gitignore b/.gitignore
index c1f3aef..ce8bd16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,8 @@ snek.d*
*.zip
*.db*
cache
+drive
+
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
diff --git a/src/snek/app.py b/src/snek/app.py
index 137abf0..8cfed8f 100644
--- a/src/snek/app.py
+++ b/src/snek/app.py
@@ -26,8 +26,8 @@ from snek.view.register import RegisterView
from snek.view.rpc import RPCView
from snek.view.status import StatusView
from snek.view.web import WebView
+from snek.view.upload import UploadView
-# base64.urlsafe_b64encode(
SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34"
@@ -81,6 +81,8 @@ class Application(BaseApplication):
self.router.add_view("/login.json", LoginView)
self.router.add_view("/register.html", RegisterView)
self.router.add_view("/register.json", RegisterView)
+ self.router.add_view("/drive.bin", UploadView)
+ self.router.add_view("/drive.bin/{uid}", UploadView)
self.router.add_get("/http-get", self.handle_http_get)
self.router.add_get("/http-photo", self.handle_http_photo)
self.router.add_get("/rpc.ws", RPCView)
diff --git a/src/snek/mapper/__init__.py b/src/snek/mapper/__init__.py
index 1841346..e4c67b0 100644
--- a/src/snek/mapper/__init__.py
+++ b/src/snek/mapper/__init__.py
@@ -5,6 +5,8 @@ from snek.mapper.channel_member import ChannelMemberMapper
from snek.mapper.channel_message import ChannelMessageMapper
from snek.mapper.notification import NotificationMapper
from snek.mapper.user import UserMapper
+from snek.mapper.drive import DriveMapper
+from snek.mapper.drive_item import DriveItemMapper
from snek.system.object import Object
@@ -17,6 +19,8 @@ def get_mappers(app=None):
"channel": ChannelMapper(app=app),
"channel_message": ChannelMessageMapper(app=app),
"notification": NotificationMapper(app=app),
+ "drive_item": DriveItemMapper(app=app),
+ "drive": DriveMapper(app=app),
}
)
diff --git a/src/snek/mapper/drive.py b/src/snek/mapper/drive.py
new file mode 100644
index 0000000..970788a
--- /dev/null
+++ b/src/snek/mapper/drive.py
@@ -0,0 +1,7 @@
+from snek.model.drive import DriveModel
+from snek.system.mapper import BaseMapper
+
+
+class DriveMapper(BaseMapper):
+ table_name = 'drive'
+ model_class = DriveModel
diff --git a/src/snek/mapper/drive_item.py b/src/snek/mapper/drive_item.py
new file mode 100644
index 0000000..c35afe1
--- /dev/null
+++ b/src/snek/mapper/drive_item.py
@@ -0,0 +1,7 @@
+from snek.system.mapper import BaseMapper
+from snek.model.drive_item import DriveItemModel
+
+class DriveItemMapper(BaseMapper):
+
+ model_class = DriveItemModel
+ table_name = 'drive_item'
diff --git a/src/snek/model/drive.py b/src/snek/model/drive.py
new file mode 100644
index 0000000..a310bbd
--- /dev/null
+++ b/src/snek/model/drive.py
@@ -0,0 +1,7 @@
+from snek.system.model import BaseModel,ModelField
+
+
+class DriveModel(BaseModel):
+
+ user_uid = ModelField(name="user_uid", required=True)
+
diff --git a/src/snek/model/drive_item.py b/src/snek/model/drive_item.py
new file mode 100644
index 0000000..74b8deb
--- /dev/null
+++ b/src/snek/model/drive_item.py
@@ -0,0 +1,9 @@
+from snek.system.model import BaseModel,ModelField
+
+
+class DriveItemModel(BaseModel):
+ drive_uid = ModelField(name="drive_uid", required=True,kind=str)
+ name = ModelField(name="name", required=True,kind=str)
+ path = ModelField(name="path", required=True,kind=str)
+ file_type = ModelField(name="file_type", required=True,kind=str)
+ file_size = ModelField(name="file_size", required=True,kind=int)
diff --git a/src/snek/service/__init__.py b/src/snek/service/__init__.py
index 97fbaae..e521c7b 100644
--- a/src/snek/service/__init__.py
+++ b/src/snek/service/__init__.py
@@ -8,6 +8,8 @@ from snek.service.notification import NotificationService
from snek.service.socket import SocketService
from snek.service.user import UserService
from snek.service.util import UtilService
+from snek.service.drive import DriveService
+from snek.service.drive_item import DriveItemService
from snek.system.object import Object
@@ -23,6 +25,8 @@ def get_services(app):
"socket": SocketService(app=app),
"notification": NotificationService(app=app),
"util": UtilService(app=app),
+ "drive": DriveService(app=app),
+ "drive_item": DriveItemService(app=app)
}
)
diff --git a/src/snek/service/channel_message.py b/src/snek/service/channel_message.py
index 8765d53..dcc12d5 100644
--- a/src/snek/service/channel_message.py
+++ b/src/snek/service/channel_message.py
@@ -29,10 +29,7 @@ class ChannelMessageService(BaseService):
model["html"] = template.render(**context)
except Exception as ex:
print(ex,flush=True)
- print("RENDER",flush=True)
- print("RECORD",context,flush=True)
- print("AFTER RENDER",flush=True)
if await self.save(model):
return model
raise Exception(f"Failed to create channel message: {model.errors}.")
diff --git a/src/snek/service/drive.py b/src/snek/service/drive.py
new file mode 100644
index 0000000..9d409a8
--- /dev/null
+++ b/src/snek/service/drive.py
@@ -0,0 +1,21 @@
+from snek.system.service import BaseService
+
+
+class DriveService(BaseService):
+
+ mapper_name = "drive"
+
+ async def get_by_user(self, user_uid):
+ drives = []
+ async for model in self.find(user_uid=user_uid):
+ drives.append(model)
+ return drives
+
+ async def get_or_create(self, user_uid):
+ drives = await self.get_by_user(user_uid=user_uid)
+ if len(drives) == 0:
+ model = await self.new()
+ model['user_uid'] = user_uid
+ await self.save(model)
+ return model
+ return drives[0]
diff --git a/src/snek/service/drive_item.py b/src/snek/service/drive_item.py
new file mode 100644
index 0000000..058f55e
--- /dev/null
+++ b/src/snek/service/drive_item.py
@@ -0,0 +1,18 @@
+from snek.system.service import BaseService
+
+
+class DriveItemService(BaseService):
+
+ mapper_name = "drive_item"
+
+ async def create(self, drive_uid, name, path, type_,size):
+ model = await self.new()
+ model['drive_uid'] = drive_uid
+ model['name'] = name
+ model['path'] = str(path)
+ model['file_type'] = type_
+ model['file_size'] = size
+ if await self.save(model):
+ return model
+ errors = await model.errors
+ raise Exception(f"Failed to create drive item: {errors}.")
diff --git a/src/snek/static/app.js b/src/snek/static/app.js
index 06fef95..a35f153 100644
--- a/src/snek/static/app.js
+++ b/src/snek/static/app.js
@@ -189,24 +189,24 @@ class Socket extends EventHandler {
}
this.isConnecting = true;
return new Promise((resolve) => {
- me.connectPromises.push(resolve);
+ this.connectPromises.push(resolve);
console.debug("Connecting..");
- const ws = new WebSocket(me.url);
+ const ws = new WebSocket(this.url);
ws.onopen = () => {
- me.ws = ws;
- me.isConnected = true;
- me.isConnecting = false;
+ this.ws = ws;
+ this.isConnected = true;
+ this.isConnecting = false;
ws.onmessage = (event) => {
- me.onData(JSON.parse(event.data));
+ this.onData(JSON.parse(event.data));
};
ws.onclose = () => {
- me.onClose();
+ this.onClose();
};
ws.onerror = () => {
- me.onClose();
+ this.onClose();
};
- me.connectPromises.forEach(resolver => resolver(me));
+ this.connectPromises.forEach(resolver => resolver(this));
};
});
}
diff --git a/src/snek/static/chat-input.js b/src/snek/static/chat-input.js
index 6a9353c..c1d767d 100644
--- a/src/snek/static/chat-input.js
+++ b/src/snek/static/chat-input.js
@@ -7,14 +7,23 @@
// MIT License: This code is open-source and can be reused and distributed under the terms of the MIT License.
class ChatInputElement extends HTMLElement {
-
+ _chatWindow = null
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.component = document.createElement('div');
this.shadowRoot.appendChild(this.component);
}
+ set chatWindow(value){
+ this._chatWindow = value
+ }
+ get chatWindow(){
+ return this._chatWindow
+ }
+ get channelUid() {
+ return this.chatWindow.channel.uid
+ }
connectedCallback() {
const link = document.createElement('link');
link.rel = 'stylesheet';
@@ -28,7 +37,8 @@ class ChatInputElement extends HTMLElement {