diff --git a/api/kiwi_vpn_api/main.py b/api/kiwi_vpn_api/main.py index 887f52e..e560590 100755 --- a/api/kiwi_vpn_api/main.py +++ b/api/kiwi_vpn_api/main.py @@ -44,7 +44,7 @@ async def on_startup() -> None: # check if configured if (current_config := await Config.load()) is not None: # connect to database - Connection.connect("sqlite:///tmp/v2.db") + Connection.connect("sqlite:///tmp/vpn.db") # # some testing # with Connection.use() as db: diff --git a/api/kiwi_vpn_api/routers/admin.py b/api/kiwi_vpn_api/routers/admin.py index 866f6a4..e856ea9 100644 --- a/api/kiwi_vpn_api/routers/admin.py +++ b/api/kiwi_vpn_api/routers/admin.py @@ -4,6 +4,7 @@ from fastapi import APIRouter, Depends, HTTPException, status +from sqlmodel import select from ..config import Config from ..db import Capability, Connection, User, UserCreate @@ -13,34 +14,57 @@ router = APIRouter(prefix="/admin", tags=["admin"]) @router.put( - "/install", + "/install/config", responses={ status.HTTP_200_OK: Responses.OK, status.HTTP_400_BAD_REQUEST: Responses.INSTALLED, }, ) -async def install( +async def initial_configure( config: Config, - # admin_user: UserCreate, current_config: Config | None = Depends(Config.load), ): """ - PUT ./install: Install `kiwi-vpn`. + PUT ./install/config: Configure `kiwi-vpn`. """ - # fail if already installed + # fail if already configured if current_config is not None: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST) # create config file, connect to database await config.save() - Connection.connect("sqlite:///tmp/v2.db") + Connection.connect("sqlite:///tmp/vpn.db") - # # create an administrative user - # new_user = User.create(**admin_user) - # assert new_user is not None - # new_user.set_capabilities([Capability.login, Capability.admin]) - # new_user.update() + +@router.put( + "/install/admin", + responses={ + status.HTTP_200_OK: Responses.OK, + status.HTTP_400_BAD_REQUEST: Responses.NOT_INSTALLED, + status.HTTP_409_CONFLICT: Responses.ENTRY_EXISTS, + }, +) +async def create_initial_admin( + admin_user: UserCreate, + current_config: Config | None = Depends(Config.load), +): + """ + PUT ./install/admin: Create the first administrative user. + """ + + # fail if not configured + if current_config is None: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST) + + with Connection.session as db: + if db.exec(select(User)).first() is not None: + raise HTTPException(status_code=status.HTTP_409_CONFLICT) + + # create an administrative user + new_user = User.create(**admin_user.dict()) + new_user.set_capabilities([Capability.login, Capability.admin]) + new_user.update() @router.put( @@ -67,4 +91,4 @@ async def set_config( # update config file, reconnect to database await new_config.save() - Connection.connect("sqlite:///tmp/v2.db") + Connection.connect("sqlite:///tmp/vpn.db")