Skip to content

Commit

Permalink
feature: post endpoint to create a new workspace; include the creatio…
Browse files Browse the repository at this point in the history
…n of its instance
  • Loading branch information
Amboyandrey authored and SchadenKai committed Sep 22, 2024
1 parent 00d157c commit fb69c72
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 7 deletions.
21 changes: 21 additions & 0 deletions backend/ee/enmedd/server/workspace/api.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from sqlite3 import IntegrityError

from fastapi import APIRouter
from fastapi import Depends
from fastapi import HTTPException
Expand All @@ -6,6 +8,7 @@
from sqlalchemy.orm import Session

from ee.enmedd.server.workspace.models import AnalyticsScriptUpload
from ee.enmedd.server.workspace.models import WorkspaceCreate
from ee.enmedd.server.workspace.models import Workspaces
from ee.enmedd.server.workspace.store import _LOGO_FILENAME
from ee.enmedd.server.workspace.store import load_analytics_script
Expand All @@ -16,6 +19,7 @@
from enmedd.db.models import User
from enmedd.db.workspace import get_workspace_by_id
from enmedd.db.workspace import get_workspace_settings
from enmedd.db.workspace import insert_workspace
from enmedd.db.workspace import upsert_workspace
from enmedd.file_store.file_store import get_default_file_store

Expand All @@ -25,6 +29,23 @@
basic_router = APIRouter(prefix="/workspace")


@admin_router.post("")
def create_workspace(
workspace: WorkspaceCreate,
user: User = Depends(current_admin_user),
db_session: Session = Depends(get_session),
) -> Workspaces:
try:
# Insert the workspace and its instance
db_workspace = insert_workspace(db_session, workspace, user_id=user.id)
except IntegrityError:
raise HTTPException(
400,
f"Workspace with name '{workspace.workspace_name}' already exists. Please choose a different name.",
)
return Workspaces.from_model(db_workspace)


# @admin_router.put("/{workspace_id}")
# def put_settings(
# workspace_id: int,
Expand Down
39 changes: 32 additions & 7 deletions backend/ee/enmedd/server/workspace/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
from enum import Enum
from typing import Optional
from uuid import UUID

from pydantic import BaseModel

from ee.enmedd.server.teamspace.models import Teamspace
Expand All @@ -10,14 +14,14 @@ class Workspaces(BaseModel):
NOTE: don't put anything sensitive in here, as this is accessible without auth."""

id: int = 0 # Default value of 0
instance_id: int
workspace_name: str | None = None
workspace_description: str | None = None
instance_id: Optional[int]
workspace_name: str
workspace_description: Optional[str]
use_custom_logo: bool = False
custom_logo: str | None = None
custom_header_logo: str | None = None
custom_header_content: str | None = None
groups: list[Teamspace]
custom_logo: Optional[str]
custom_header_logo: Optional[str]
custom_header_content: Optional[str]
groups: Optional[list[Teamspace]]

@classmethod
def from_model(cls, workspace_model: WorkspaceModel) -> "Workspaces":
Expand All @@ -40,6 +44,27 @@ def check_validity(self) -> None:
return


class WorkspaceCreate(BaseModel):
workspace_name: str
workspace_description: Optional[str]
use_custom_logo: bool = False
custom_logo: Optional[str]
custom_header_logo: Optional[str]
custom_header_content: Optional[str]
user_ids: list[UUID]


class InstanceSubscriptionPlan(str, Enum):
ENTERPRISE = "enterprise"
PARTNER = "partner"


class Instance(BaseModel):
instance_name: Optional[str]
subscription_plan: InstanceSubscriptionPlan
owner_id: UUID


class AnalyticsScriptUpload(BaseModel):
script: str
secret_key: str
49 changes: 49 additions & 0 deletions backend/enmedd/db/workspace.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,63 @@
from uuid import UUID

from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import Session

from ee.enmedd.server.workspace.models import InstanceSubscriptionPlan
from ee.enmedd.server.workspace.models import WorkspaceCreate
from enmedd.auth.schemas import UserRole
from enmedd.db.models import Instance
from enmedd.db.models import User
from enmedd.db.models import Workspace
from enmedd.db.models import Workspace__Users


def _add_user__workspace_relationships__no_commit(
db_session: Session, workspace_id: int, user_ids: list[UUID]
) -> list[Workspace__Users]:
"""NOTE: does not commit the transaction."""
relationships = [
Workspace__Users(user_id=user_id, workspace_id=workspace_id)
for user_id in user_ids
]
db_session.add_all(relationships)
return relationships


def insert_workspace(
db_session: Session, workspace: WorkspaceCreate, user_id: UUID
) -> Workspace:
db_instance = Instance(
instance_name=workspace.workspace_name,
subscription_plan=InstanceSubscriptionPlan.PARTNER, # You can modify this if needed
owner_id=user_id,
)
db_session.add(db_instance)
db_session.flush() # flush to assign the instance an ID
db_workspace = Workspace(
instance_id=db_instance.id,
workspace_name=workspace.workspace_name,
workspace_description=workspace.workspace_description,
use_custom_logo=workspace.use_custom_logo,
custom_logo=workspace.custom_logo,
custom_header_logo=workspace.custom_header_logo,
custom_header_content=workspace.custom_header_content,
)
db_session.add(db_workspace)
db_session.flush() # give the workspace an ID

_add_user__workspace_relationships__no_commit(
db_session=db_session,
workspace_id=db_workspace.id,
user_ids=workspace.user_ids,
)

db_session.commit()
return db_workspace


# def put_workspace(
# workspace_id: int,
# db_session: Session,
Expand Down

0 comments on commit fb69c72

Please sign in to comment.