Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: post endpoint to create a new workspace; include the creation of its instance #133

Merged
merged 1 commit into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading