diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json
index 913b8f2..93f952f 100644
--- a/frontend/tsconfig.app.json
+++ b/frontend/tsconfig.app.json
@@ -3,6 +3,7 @@
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
+ "composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"paths": {
diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json
index a83dfc9..5a0c6a5 100644
--- a/frontend/tsconfig.node.json
+++ b/frontend/tsconfig.node.json
@@ -5,10 +5,10 @@
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
- "playwright.config.*",
- "eslint.config.*"
+ "playwright.config.*"
],
"compilerOptions": {
+ "composite": true,
"noEmit": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index dfcebe7..3b180e9 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -19,7 +19,7 @@ export default defineConfig({
port: 8081,
host: '0.0.0.0',
proxy: {
- '/api': 'http://localhost:8080',
+ '/api': 'http://localhost:7000',
},
},
})
diff --git a/frontend/vitest.config.ts b/frontend/vitest.config.ts
deleted file mode 100644
index c328717..0000000
--- a/frontend/vitest.config.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { fileURLToPath } from 'node:url'
-import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'
-import viteConfig from './vite.config'
-
-export default mergeConfig(
- viteConfig,
- defineConfig({
- test: {
- environment: 'jsdom',
- exclude: [...configDefaults.exclude, 'e2e/**'],
- root: fileURLToPath(new URL('./', import.meta.url)),
- },
- }),
-)
diff --git a/simple_chat_api/__init__.py b/simple_chat_api/__init__.py
new file mode 100644
index 0000000..043ae30
--- /dev/null
+++ b/simple_chat_api/__init__.py
@@ -0,0 +1 @@
+from simple_chat_api.main import main
\ No newline at end of file
diff --git a/simple_chat_api/__main__.py b/simple_chat_api/__main__.py
new file mode 100644
index 0000000..363f585
--- /dev/null
+++ b/simple_chat_api/__main__.py
@@ -0,0 +1,4 @@
+from simple_chat_api.main import main
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/backend_py/config.py b/simple_chat_api/config.py
similarity index 100%
rename from backend_py/config.py
rename to simple_chat_api/config.py
diff --git a/backend_py/db_handler.py b/simple_chat_api/db_handler.py
similarity index 91%
rename from backend_py/db_handler.py
rename to simple_chat_api/db_handler.py
index ad9c9bd..f72fa61 100644
--- a/backend_py/db_handler.py
+++ b/simple_chat_api/db_handler.py
@@ -3,6 +3,7 @@ from sqlalchemy.orm import declarative_base, sessionmaker
from sqlalchemy import Column, Integer, String
from dataclasses import dataclass
import time
+import regex
Base = declarative_base()
@@ -34,8 +35,8 @@ class DbConnector:
def _create_defaults(self):
try:
self.add_user(name="admin", hash="$2b$12$IcUr5w7pIFaXaGVFP5yVV.b.sIYjDbETR3l2PKgWO4nkrHU.1HmFa", role="admin")
- except ValueError:
- print("Default admin user already exists")
+ except ValueError as e:
+ print(f"Default admin user already exists: {e}")
def get_user(self, name: str) -> User | dict[User] | None:
if not name:
@@ -45,6 +46,8 @@ class DbConnector:
def add_user(self, name: str, hash: str, role: str = "user"):
if self.get_user(name):
raise ValueError("User already exists")
+ if regex.match(r'^[^<>:;,?"*|/]+$', name) is None:
+ raise ValueError("Invalid username")
new_user = User()
new_user.name = name
new_user.hash = hash
diff --git a/backend_py/endpoints/auth.py b/simple_chat_api/endpoints/auth.py
similarity index 97%
rename from backend_py/endpoints/auth.py
rename to simple_chat_api/endpoints/auth.py
index 1186e6d..6122bd3 100644
--- a/backend_py/endpoints/auth.py
+++ b/simple_chat_api/endpoints/auth.py
@@ -1,8 +1,6 @@
from functools import wraps
from bottle import Bottle, request, response
-from config import JWT_SECRET
-from config import hash_context
-
+from simple_chat_api.config import JWT_SECRET, hash_context
import jwt
from bottle import request, response
@@ -11,7 +9,7 @@ from bottle import request, response
import time
from json import dumps, loads
-from utils import read_keys_from_request
+from simple_chat_api.utils import read_keys_from_request
app = Bottle()
diff --git a/backend_py/endpoints/messages.py b/simple_chat_api/endpoints/messages.py
similarity index 87%
rename from backend_py/endpoints/messages.py
rename to simple_chat_api/endpoints/messages.py
index a84d0c6..3846e19 100644
--- a/backend_py/endpoints/messages.py
+++ b/simple_chat_api/endpoints/messages.py
@@ -2,9 +2,9 @@
from bottle import Bottle, request, response
from json import dumps, loads
-from db_handler import User, Message
-from endpoints.auth import user_guard
-from utils import read_keys_from_request
+from simple_chat_api.db_handler import User, Message
+from simple_chat_api.endpoints.auth import user_guard
+from simple_chat_api.utils import read_keys_from_request
app = Bottle()
def serialize_message(messages: list[Message]) -> str:
diff --git a/backend_py/main.py b/simple_chat_api/main.py
similarity index 68%
rename from backend_py/main.py
rename to simple_chat_api/main.py
index 5fe6f32..c3677c5 100644
--- a/backend_py/main.py
+++ b/simple_chat_api/main.py
@@ -1,9 +1,9 @@
from bottle import request, Bottle
-from db_handler import DbConnector
+from simple_chat_api.db_handler import DbConnector
-import endpoints.auth as auth
-import endpoints.messages as messages
+import simple_chat_api.endpoints.auth as auth
+import simple_chat_api.endpoints.messages as messages
import bcrypt
# Needet because of: https://github.com/pyca/bcrypt/issues/684
@@ -14,7 +14,7 @@ app = Bottle()
def initialize_app():
- db = DbConnector("sqlite:///./data/db.sqlite")
+ db = DbConnector("sqlite:///./data/data.sqlite")
@app.hook('before_request')
def attach_resources():
@@ -23,7 +23,7 @@ def initialize_app():
return app
-if __name__ == "__main__":
+def main():
initialize_app()
app.mount('/user', auth.app)
@@ -31,4 +31,4 @@ if __name__ == "__main__":
root_app = Bottle()
root_app.mount('/api', app)
- root_app.run(host='localhost', port=8080, debug=True)
\ No newline at end of file
+ root_app.run(host='localhost', port=7000, debug=True)
\ No newline at end of file
diff --git a/simple_chat_api/requirements.txt b/simple_chat_api/requirements.txt
new file mode 100644
index 0000000..4d013bf
--- /dev/null
+++ b/simple_chat_api/requirements.txt
@@ -0,0 +1,11 @@
+bcrypt==4.3.0
+bottle==0.13.4
+cffi==1.17.1
+cryptography==45.0.4
+greenlet==3.2.3
+passlib==1.7.4
+pycparser==2.22
+PyJWT==2.10.1
+regex==2025.7.34
+SQLAlchemy==2.0.41
+typing_extensions==4.14.0
diff --git a/backend_py/utils.py b/simple_chat_api/utils.py
similarity index 100%
rename from backend_py/utils.py
rename to simple_chat_api/utils.py