Implementing dataProvider and tuniong create route

This commit is contained in:
2025-04-07 23:51:29 +02:00
parent 661841ceef
commit bc059de65b
6 changed files with 22 additions and 28 deletions

View File

@@ -22,7 +22,8 @@ class FirmRead(BaseModel):
name: str = Field() name: str = Field()
class FirmCreate(FirmRead): class FirmCreate(FirmRead):
pass instance: str = Field(max_length=32, min_length=3, pattern="^[0-9a-z-]+$")
name: str = Field(max_length=32, min_length=3, pattern="^[0-9a-z-]+$")
class FirmUpdate(FirmRead): class FirmUpdate(BaseModel):
pass owner: PydanticObjectId = Field()

View File

@@ -12,15 +12,15 @@ model_update = FirmUpdate
router = APIRouter() router = APIRouter()
@router.post("/", response_description="{} added to the database".format(model.__name__)) @router.post("/", response_description="{} added to the database".format(model.__name__))
async def create(item: model_create, user=Depends(get_current_user)) -> dict: async def create(item: model_create, user=Depends(get_current_user)) -> model_read:
exists = await Firm.find_one({"name": item.name, "instance": item.instance}) exists = await Firm.find_one({"name": item.name, "instance": item.instance})
if exists: if exists:
raise HTTPException(status_code=400, detail="Firm already exists") raise HTTPException(status_code=400, detail="Firm already exists")
item.created_by = user.id record = model(created_by=user.id, updated_by=user.id, owner=user.id, **item.model_dump())
item.updated_by = user.id o = await record.create()
item.owner = user.id user.firms.append(o.id)
o = await model(**item.model_dump()).create() user.save()
return model_read(**o.model_dump()) return model_read(**o.model_dump())
@router.get("/{id}", response_description="{} record retrieved".format(model.__name__)) @router.get("/{id}", response_description="{} record retrieved".format(model.__name__))

View File

@@ -1,12 +1,13 @@
from beanie import PydanticObjectId
from fastapi_users_db_beanie import BaseOAuthAccount, BeanieUserDatabase, BeanieBaseUserDocument from fastapi_users_db_beanie import BaseOAuthAccount, BeanieUserDatabase, BeanieBaseUserDocument
from pydantic import Field from pydantic import Field
class OAuthAccount(BaseOAuthAccount): class OAuthAccount(BaseOAuthAccount):
pass pass
class User(BeanieBaseUserDocument): class User(BeanieBaseUserDocument):
oauth_accounts: list[OAuthAccount] = Field(default_factory=list) oauth_accounts: list[OAuthAccount] = Field(default_factory=list)
firms: list[PydanticObjectId] = Field(default_factory=list)
class UserDatabase(BeanieUserDatabase): class UserDatabase(BeanieUserDatabase):
pass pass

View File

@@ -1,5 +1,7 @@
from beanie import PydanticObjectId from beanie import PydanticObjectId
from fastapi_users.schemas import BaseUser from fastapi_users.schemas import BaseUser
from pydantic import Field
class UserSchema(BaseUser[PydanticObjectId]): class UserSchema(BaseUser[PydanticObjectId]):
pass firms: list[PydanticObjectId] = Field()

View File

@@ -13,9 +13,9 @@ import routerBindings, {
DocumentTitleHandler, DocumentTitleHandler,
UnsavedChangesNotifier, UnsavedChangesNotifier,
} from "@refinedev/react-router"; } from "@refinedev/react-router";
import dataProvider from "@refinedev/simple-rest";
import { BrowserRouter, Outlet, Route, Routes } from "react-router"; import { BrowserRouter, Outlet, Route, Routes } from "react-router";
import { authProvider } from "./providers/auth-provider"; import { authProvider } from "./providers/auth-provider";
import { dataProvider } from "./providers/data-provider";
import { ColorModeContextProvider } from "./contexts/color-mode"; import { ColorModeContextProvider } from "./contexts/color-mode";
import { Login } from "./components/auth/Login"; import { Login } from "./components/auth/Login";
import { Register } from "./components/auth/Register"; import { Register } from "./components/auth/Register";
@@ -36,7 +36,7 @@ function App() {
<RefineSnackbarProvider> <RefineSnackbarProvider>
<Refine <Refine
authProvider={authProvider} authProvider={authProvider}
dataProvider={dataProvider("https://api.fake-rest.refine.dev")} dataProvider={dataProvider}
notificationProvider={useNotificationProvider} notificationProvider={useNotificationProvider}
routerProvider={routerBindings} routerProvider={routerBindings}
options={{ options={{

View File

@@ -1,20 +1,10 @@
import type { DataProvider } from "@refinedev/core"; import type { DataProvider } from "@refinedev/core";
const API_URL = "http://localhost:8000"; const API_URL = "/api/v1";
const fetcher = async (url: string, options?: RequestInit) => {
return fetch(url, {
...options,
headers: {
...options?.headers,
Authorization: "Bearer " + localStorage.getItem("access_token"),
},
});
};
export const dataProvider: DataProvider = { export const dataProvider: DataProvider = {
getOne: async ({ resource, id, meta }) => { getOne: async ({ resource, id, meta }) => {
const response = id !== "" ? await fetcher(`${API_URL}/${resource}/${id}`) : await fetcher(`${API_URL}/${resource}`); const response = id !== "" ? await fetch(`${API_URL}/${resource}/${id}`) : await fetch(`${API_URL}/${resource}`);
if (response.status < 200 || response.status > 299) throw response; if (response.status < 200 || response.status > 299) throw response;
const data = await response.json(); const data = await response.json();
@@ -24,7 +14,7 @@ export const dataProvider: DataProvider = {
}; };
}, },
update: async ({ resource, id, variables }) => { update: async ({ resource, id, variables }) => {
const response = await fetcher(`${API_URL}/${resource}/${id}`, { const response = await fetch(`${API_URL}/${resource}/${id}`, {
method: "PUT", method: "PUT",
body: JSON.stringify(variables), body: JSON.stringify(variables),
headers: { headers: {
@@ -58,7 +48,7 @@ export const dataProvider: DataProvider = {
}); });
} }
const response = await fetcher(`${API_URL}/${resource}?${params.toString()}`); const response = await fetch(`${API_URL}/${resource}?${params.toString()}`);
if (response.status < 200 || response.status > 299) throw response; if (response.status < 200 || response.status > 299) throw response;
@@ -70,7 +60,7 @@ export const dataProvider: DataProvider = {
}; };
}, },
create: async ({ resource, variables }) => { create: async ({ resource, variables }) => {
const response = await fetcher(`${API_URL}/${resource}`, { const response = await fetch(`${API_URL}/${resource}`, {
method: "POST", method: "POST",
body: JSON.stringify(variables), body: JSON.stringify(variables),
headers: { headers: {
@@ -85,7 +75,7 @@ export const dataProvider: DataProvider = {
return { data }; return { data };
}, },
deleteOne: async ({ resource, id, variables, meta }) => { deleteOne: async ({ resource, id, variables, meta }) => {
const response = await fetcher(`${API_URL}/${resource}/${id}`,{ const response = await fetch(`${API_URL}/${resource}/${id}`,{
method: "DELETE", method: "DELETE",
}); });