Implementing dataProvider and tuniong create route
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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__))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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={{
|
||||||
|
|||||||
@@ -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",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user