Skip to content

Commit

Permalink
Merge branch 'development-env' into feature/rebranding/revamp-teamspace
Browse files Browse the repository at this point in the history
  • Loading branch information
SchadenKai authored Sep 22, 2024
2 parents 09d67b4 + fb69c72 commit 33e5a2a
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 8 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
77 changes: 77 additions & 0 deletions web/src/app/chat/sessionSidebar/GlobalSidebar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { UserSettingsButton } from "@/components/UserSettingsButton";
import Image from "next/image";

import ArnoldAi from "../../../../public/arnold_ai.png";
import { Separator } from "@/components/ui/separator";
import { User } from "@/lib/types";
import { CustomTooltip } from "@/components/CustomTooltip";
import { Logo } from "@/components/Logo";
import { useContext } from "react";
import { SettingsContext } from "@/components/settings/SettingsProvider";
import Link from "next/link";
import { useTeamspaces } from "@/lib/hooks";
import { TeamspaceBubble } from "@/components/TeamspaceBubble";
import { Ellipsis } from "lucide-react";

interface GlobalSidebarProps {
openSidebar?: boolean;
user?: User | null;
}

export const GlobalSidebar = ({ openSidebar, user }: GlobalSidebarProps) => {
const { data } = useTeamspaces();

const combinedSettings = useContext(SettingsContext);
if (!combinedSettings) {
return null;
}
const settings = combinedSettings.settings;
const workspaces = combinedSettings.workspaces;
const defaultPage = settings.default_page;

return (
<div className={`bg-background h-full p-4 border-r border-border z-10`}>
<div
className={`h-full flex flex-col justify-between transition-opacity duration-300 ease-in-out lg:!opacity-100 ${
openSidebar ? "opacity-100 delay-200" : "opacity-0 delay-100"
}`}
>
<div className="flex flex-col items-center h-full">
<Image
src={ArnoldAi}
alt="ArnoldAi Logo"
width={40}
height={40}
className="rounded-regular shrink-0"
/>
<Separator className="mt-4" />
<div className="flex flex-col items-center gap-4 pt-4">
<CustomTooltip
trigger={
<Link href={`/${defaultPage}`} className="flex items-center">
<Logo />
</Link>
}
side="right"
delayDuration={0}
>
{workspaces!.workspace_name
? workspaces!.workspace_name
: "enMedD AI"}
</CustomTooltip>
</div>
g
<Separator className="mt-4" />
<div className="flex flex-col gap-3 pt-4">
{data?.map((teamspace, i) => (
<TeamspaceBubble teamspace={teamspace} link={defaultPage} />
))}
</div>
</div>
<div className="flex flex-col items-center gap-4">
<UserSettingsButton user={user} defaultPage={defaultPage} />
</div>
</div>
</div>
);
};
1 change: 0 additions & 1 deletion web/src/app/ee/admin/teams/TeamspacesCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ export const TeamspacesCard = ({
}`}
/>
</h2>

<span className="text-sm text-subtle">@mrquilbot</span>
</div>

Expand Down

0 comments on commit 33e5a2a

Please sign in to comment.