From 9cd4c8a5ab05e1071668169159dadde58a0a098c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Sun, 29 Oct 2023 17:16:50 +0900 Subject: [PATCH 1/7] event&eventaction --- backend/app/api/api_v1/routers/platform.py | 31 +++++++++++++++++++++- backend/app/db/crud.py | 14 +++++++++- backend/app/db/models.py | 17 +++++++++++- backend/app/db/schemas.py | 11 ++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index 07ae5f7..3bc409d 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -183,4 +183,33 @@ async def domain_delete( db=Depends(get_db), ): - return delete_domain(db, userid,id) \ No newline at end of file + return delete_domain(db, userid,id) + + +@r.get( + "/events", + response_model=t.List[Event], + response_model_exclude={"id"}, + response_model_exclude_none=True, +) +async def event_data( + request: Request, + db=Depends(get_db), +): + events = get_events(db) + return events + + +@r.get( + "/eventactions/{eventid}", + response_model=t.List[Action], + response_model_exclude={"id"}, + response_model_exclude_none=True, +) +async def eventactions_data( + request: Request, + eventid: str, + db=Depends(get_db), +): + actions = get_eventactions(db,eventid) + return actions \ No newline at end of file diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index 4b5fcdc..2b983a9 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -224,4 +224,16 @@ def get_domain(db: Session, userid: str): domains = db.query(models.UserDomain).filter(models.UserDomain.userid == userid).all() if not domains: raise HTTPException(status_code=404, detail="Data not found") - return domains \ No newline at end of file + return domains + +def get_events(db: Session): + events = db.query(models.Event).all() + if not events: + raise HTTPException(status_code=404, detail="Data not found") + return events + +def get_eventactions(db: Session,eventid: str): + eveactions = db.query(models.Action).join(models.EventAction,models.EventAction.actionid == models.Action.id ).join(models.Event,models.Event.id == models.EventAction.eventid).filter(models.Event.eventid == eventid).all() + if not eveactions: + raise HTTPException(status_code=404, detail="Data not found") + return eveactions \ No newline at end of file diff --git a/backend/app/db/models.py b/backend/app/db/models.py index b22033a..49a8994 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -58,4 +58,19 @@ class UserDomain(Base): url = Column(String(200), nullable=False) kintoneuser = Column(String(100), nullable=False) kintonepwd = Column(String(100), nullable=False) - active = Column(Boolean, default=False) \ No newline at end of file + active = Column(Boolean, default=False) + +class Event(Base): + __tablename__ = "event" + + category = Column(String(100), nullable=False) + type = Column(String(100), nullable=False) + eventid= Column(String(100), nullable=False) + function = Column(String(500), nullable=False) + mobile = Column(Boolean, default=False) + +class EventAction(Base): + __tablename__ = "eventaction" + + eventid = Column(Integer,ForeignKey("event.id")) + actionid = Column(Integer,ForeignKey("action.id")) \ No newline at end of file diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index ef75fe1..5d36ee3 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -122,5 +122,16 @@ class Domain(Base): kintonepwd: str active:bool + class Config: + orm_mode = True + +class Event(Base): + id: int + category: str + type: str + eventid: str + function: str + mobile: bool + class Config: orm_mode = True \ No newline at end of file From f60f97380fa9743dc9e7ab00888a77a0100e45c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Wed, 1 Nov 2023 22:56:47 +0900 Subject: [PATCH 2/7] domain --- backend/app/api/api_v1/routers/auth.py | 2 +- backend/app/api/api_v1/routers/platform.py | 76 ++++++- backend/app/db/crud.py | 61 +++++- backend/app/db/models.py | 22 +- backend/app/db/schemas.py | 6 +- frontend/src/components/DomainSelect.vue | 42 ++++ frontend/src/layouts/MainLayout.vue | 8 + frontend/src/pages/TenantDomain.vue | 225 +++++++++++++++++++++ frontend/src/pages/UserDomain.vue | 170 +++++----------- frontend/src/router/routes.ts | 3 +- frontend/src/stores/useAuthStore.ts | 22 +- 11 files changed, 490 insertions(+), 147 deletions(-) create mode 100644 frontend/src/components/DomainSelect.vue create mode 100644 frontend/src/pages/TenantDomain.vue diff --git a/backend/app/api/api_v1/routers/auth.py b/backend/app/api/api_v1/routers/auth.py index 05247f5..cf19ea9 100644 --- a/backend/app/api/api_v1/routers/auth.py +++ b/backend/app/api/api_v1/routers/auth.py @@ -33,7 +33,7 @@ async def login( expires_delta=access_token_expires, ) - return {"access_token": access_token, "token_type": "bearer"} + return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name,"user_id" : user.id} @r.post("/signup") diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index 3bc409d..af4cf31 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -140,18 +140,17 @@ async def flow_delete( return delete_flow(db, flowid) @r.get( - "/domain/{userid}", + "/domains/{tenantid}", response_model=List[Domain], response_model_exclude_none=True, ) async def domain_details( request: Request, - userid: str, + tenantid:str, db=Depends(get_db), ): - domains = get_domain(db, userid) + domains = get_domains(db,tenantid) return domains - @r.post("/domain", response_model=Domain, response_model_exclude_none=True) async def domain_create( @@ -174,16 +173,79 @@ async def domain_edit( @r.delete( - "/domain/{userid}/{id}", response_model=Domain, response_model_exclude_none=True + "/domain/{id}", response_model=Domain, response_model_exclude_none=True ) async def domain_delete( request: Request, - userid: int, id: int, db=Depends(get_db), ): - return delete_domain(db, userid,id) + return delete_domain(db,id) + +@r.get( + "/domain/{userid}", + response_model=List[Domain], + response_model_exclude_none=True, +) +async def userdomain_details( + request: Request, + userid: str, + db=Depends(get_db), +): + domains = get_domain(db, userid) + return domains + +@r.post( + "/domain/{userid}", + response_model_exclude_none=True, +) +async def create_userdomain( + request: Request, + userid: int, + domainids:list, + db=Depends(get_db), +): + domain = add_userdomain(db, userid,domainids) + return domain + +@r.delete( + "/domain/{domainid}/{userid}", response_model_exclude_none=True +) +async def userdomain_delete( + request: Request, + domainid:int, + userid: int, + db=Depends(get_db), +): + return delete_userdomain(db, userid,domainid) + + +@r.get( + "/activedomain/{userid}", + response_model=Domain, + response_model_exclude_none=True, +) +async def get_useractivedomain( + request: Request, + userid: int, + db=Depends(get_db), +): + domain = get_activedomain(db, userid) + return domain + +@r.put( + "/activedomain/{userid}/{domainid}", + response_model_exclude_none=True, +) +async def update_activeuserdomain( + request: Request, + userid: int, + domainid:int, + db=Depends(get_db), +): + domain = active_userdomain(db, userid,domainid) + return domain @r.get( diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index 2b983a9..9692e7c 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -1,5 +1,6 @@ from fastapi import HTTPException, status from sqlalchemy.orm import Session +from sqlalchemy import and_ import typing as t from . import models, schemas @@ -182,8 +183,8 @@ def get_flows_by_app(db: Session, appid: str): return flows def create_domain(db: Session, domain: schemas.DomainBase): - db_domain = models.UserDomain( - userid=domain.userid, + db_domain = models.Domain( + tenantid = domain.tenantid, name=domain.name, url=domain.url, kintoneuser=domain.kintoneuser, @@ -194,9 +195,9 @@ def create_domain(db: Session, domain: schemas.DomainBase): db.refresh(db_domain) return db_domain -def delete_domain(db: Session, userid: int,id: int): - db_domain = db.query(models.UserDomain).get(id) - if not db_domain or db_domain.userid != userid: +def delete_domain(db: Session,id: int): + db_domain = db.query(models.Domain).get(id) + if not db_domain: raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found") db.delete(db_domain) db.commit() @@ -206,8 +207,8 @@ def delete_domain(db: Session, userid: int,id: int): def edit_domain( db: Session, domain: schemas.DomainBase ) -> schemas.Domain: - db_domain = db.query(models.UserDomain).get(domain.id) - if not db_domain or db_domain.userid != domain.userid: + db_domain = db.query(models.Domain).get(domain.id) + if not db_domain: raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found") update_data = domain.dict(exclude_unset=True) @@ -220,8 +221,52 @@ def edit_domain( db.refresh(db_domain) return db_domain +def add_userdomain(db: Session, userid:int,domainids:list): + for domainid in domainids: + db_domain = models.UserDomain( + userid = userid, + domainid = domainid + ) + db.add(db_domain) + db.commit() + db.refresh(db_domain) + return db_domain + +def delete_userdomain(db: Session, userid: int,domainid: int): + db_domain = db.query(models.UserDomain).filter(and_(models.UserDomain.userid == userid,models.UserDomain.domainid == domainid)).first() + if not db_domain: + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found") + db.delete(db_domain) + db.commit() + return db_domain + +def active_userdomain(db: Session, userid: int,domainid: int): + db_userdomains = db.query(models.UserDomain).filter(models.UserDomain.userid == userid).all() + if not db_userdomains: + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found") + for domain in db_userdomains: + if domain.domainid == domainid: + domain.active = True + else: + domain.active = False + db.add(domain) + db.commit() + return db_userdomains + +def get_activedomain(db: Session, userid: int): + db_domain = db.query(models.Domain).join(models.UserDomain,models.UserDomain.domainid == models.Domain.id ).filter(and_(models.UserDomain.userid == userid,models.UserDomain.active == True)).first() + if not db_domain: + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found") + return db_domain + def get_domain(db: Session, userid: str): - domains = db.query(models.UserDomain).filter(models.UserDomain.userid == userid).all() + domains = db.query(models.Domain).join(models.UserDomain,models.UserDomain.domainid == models.Domain.id ).filter(models.UserDomain.userid == userid).all() + if not domains: + raise HTTPException(status_code=404, detail="Data not found") + return domains + +def get_domains(db: Session,tenantid:str): + domains = db.query(models.Domain).filter(models.Domain.tenantid == tenantid ).all() if not domains: raise HTTPException(status_code=404, detail="Data not found") return domains diff --git a/backend/app/db/models.py b/backend/app/db/models.py index 49a8994..7cb4e7d 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -50,14 +50,30 @@ class Flow(Base): name = Column(String(200)) content = Column(String) -class UserDomain(Base): - __tablename__ = "userdomain" +class Tenant(Base): + __tablename__ = "tenant" - userid = Column(Integer,ForeignKey("user.id")) + tenantid = Column(String(100), index=True, nullable=False) + name = Column(String(200)) + licence = Column(String(200)) + startdate = Column(DateTime) + enddate = Column(DateTime) + +class Domain(Base): + __tablename__ = "domain" + + tenantid = Column(String(100), index=True, nullable=False) name = Column(String(100), nullable=False) url = Column(String(200), nullable=False) kintoneuser = Column(String(100), nullable=False) kintonepwd = Column(String(100), nullable=False) + + +class UserDomain(Base): + __tablename__ = "userdomain" + + userid = Column(Integer,ForeignKey("user.id")) + domainid = Column(Integer,ForeignKey("domain.id")) active = Column(Boolean, default=False) class Event(Base): diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index 5d36ee3..cf1322e 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -106,21 +106,19 @@ class Flow(Base): class DomainBase(BaseModel): id: int - userid: int + tenantid: str name: str url: str kintoneuser: str kintonepwd: str - active:bool = False class Domain(Base): id: int - userid: str + tenantid: str name: str url: str kintoneuser: str kintonepwd: str - active:bool class Config: orm_mode = True diff --git a/frontend/src/components/DomainSelect.vue b/frontend/src/components/DomainSelect.vue new file mode 100644 index 0000000..0c05d30 --- /dev/null +++ b/frontend/src/components/DomainSelect.vue @@ -0,0 +1,42 @@ + + diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue index 2dffa94..ec5c8a4 100644 --- a/frontend/src/layouts/MainLayout.vue +++ b/frontend/src/layouts/MainLayout.vue @@ -14,6 +14,14 @@ Kintone App Builder V{{ env.version }} + + + {{ authStore.domain }} + + + + {{ authStore.name }} + diff --git a/frontend/src/pages/TenantDomain.vue b/frontend/src/pages/TenantDomain.vue new file mode 100644 index 0000000..60407a5 --- /dev/null +++ b/frontend/src/pages/TenantDomain.vue @@ -0,0 +1,225 @@ + + + diff --git a/frontend/src/pages/UserDomain.vue b/frontend/src/pages/UserDomain.vue index fd651be..11f1abb 100644 --- a/frontend/src/pages/UserDomain.vue +++ b/frontend/src/pages/UserDomain.vue @@ -111,7 +111,7 @@ export default { - - - -
Kintone Account
-
- - - - - - - - - - - - - - - - - - - - -
- -
+ + + @@ -201,23 +173,23 @@ export default { diff --git a/frontend/src/router/routes.ts b/frontend/src/router/routes.ts index 9e53020..77aeab2 100644 --- a/frontend/src/router/routes.ts +++ b/frontend/src/router/routes.ts @@ -19,7 +19,8 @@ const routes: RouteRecordRaw[] = [ { path: 'flowEditor2', component: () => import('pages/FlowChart.vue') }, { path: 'flowChart2', component: () => import('pages/FlowEditorPage2.vue') }, { path: 'right', component: () => import('pages/testRight.vue') }, - { path: 'domain', component: () => import('pages/UserDomain.vue') } + { path: 'domain', component: () => import('pages/TenantDomain.vue') }, + { path: 'userdomain', component: () => import('pages/UserDomain.vue') } ], }, // Always leave this as last one, diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index bf59d17..03e0e1a 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -7,6 +7,9 @@ export const useAuthStore = defineStore({ id: 'auth', state: () => ({ token: localStorage.getItem('token'), + id:localStorage.getItem('id'), + name:localStorage.getItem('name'), + domain:localStorage.getItem('domain'), returnUrl: '' }), actions: { @@ -18,7 +21,14 @@ export const useAuthStore = defineStore({ const result = await api.post(`http://127.0.0.1:8000/api/token`,params); console.info(result); this.token =result.data.access_token; + this.id = result.data.user_id; + this.name = result.data.user_name; localStorage.setItem('token', result.data.access_token); + localStorage.setItem('id', result.data.user_id); + localStorage.setItem('name', result.data.user_name); + const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain/`+this.id); + this.domain = activedomain.data.name; + localStorage.setItem('domain', activedomain.data.name); Router.push(this.returnUrl || '/'); return true; }catch(e) @@ -30,7 +40,17 @@ export const useAuthStore = defineStore({ logout() { this.token = null; localStorage.removeItem('token'); + localStorage.removeItem('id'); + localStorage.removeItem('name'); + localStorage.removeItem('domain'); Router.push('/login'); - } + }, + userdomain() { + Router.push('/userdomain'); + }, + changedomain(domain:string){ + this.domain = domain; + localStorage.setItem('domain', domain); + } } }); From 617b060869571aa52639ed9e00ecc960b3f8c7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Sat, 4 Nov 2023 15:12:27 +0900 Subject: [PATCH 3/7] login user --- backend/app/api/api_v1/routers/auth.py | 8 +- backend/app/api/api_v1/routers/kintone.py | 208 ++++++++++----------- backend/app/api/api_v1/routers/platform.py | 18 +- backend/app/core/auth.py | 10 +- backend/app/core/config.py | 19 +- backend/app/db/schemas.py | 1 + frontend/src/pages/UserDomain.vue | 8 +- frontend/src/stores/useAuthStore.ts | 5 +- 8 files changed, 141 insertions(+), 136 deletions(-) diff --git a/backend/app/api/api_v1/routers/auth.py b/backend/app/api/api_v1/routers/auth.py index cf19ea9..9f9c2d0 100644 --- a/backend/app/api/api_v1/routers/auth.py +++ b/backend/app/api/api_v1/routers/auth.py @@ -29,11 +29,11 @@ async def login( else: permissions = "user" access_token = security.create_access_token( - data={"sub": user.email, "permissions": permissions}, + data={"sub": user.id, "permissions": permissions}, expires_delta=access_token_expires, ) - return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name,"user_id" : user.id} + return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name} @r.post("/signup") @@ -56,8 +56,8 @@ async def signup( else: permissions = "user" access_token = security.create_access_token( - data={"sub": user.email, "permissions": permissions}, + data={"sub": user.id, "permissions": permissions}, expires_delta=access_token_expires, ) - return {"access_token": access_token, "token_type": "bearer"} + return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name} diff --git a/backend/app/api/api_v1/routers/kintone.py b/backend/app/api/api_v1/routers/kintone.py index 3734a47..c0fd59b 100644 --- a/backend/app/api/api_v1/routers/kintone.py +++ b/backend/app/api/api_v1/routers/kintone.py @@ -5,21 +5,29 @@ import pandas as pd import json import httpx import deepdiff -import app.core.config as c +import app.core.config as config import os -import sys from app.db.session import SessionLocal -from app.db.crud import get_flows_by_app +from app.db.crud import get_flows,get_activedomain +from app.core.auth import get_current_active_user,get_current_user kinton_router = r = APIRouter() +def getkintoneenv(user = Depends(get_current_user)): + db = SessionLocal() + domain = get_activedomain(db, user.id) + db.close() + kintoneevn = config.KINTONE_ENV(domain) + return kintoneevn + + def getfieldsfromexcel(df): appname = df.iloc[0,2] col=[] for row in range(5,len(df)): if pd.isna(df.iloc[row,1]): break - if not df.iloc[row,3] in c.KINTONE_FIELD_TYPE: + if not df.iloc[row,3] in config.KINTONE_FIELD_TYPE: continue p=[] for column in range(1,7): @@ -42,10 +50,10 @@ def getsettingfromexcel(df): des = df.iloc[2,2] return {"name":appname,"description":des} -def getsettingfromkintone(app:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +def getsettingfromkintone(app:str,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} params = {"app":app} - url = f"{c.BASE_URL}{c.API_V1_STR}/app/settings.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/app/settings.json" r = httpx.get(url,headers=headers,params=params) return r.json() @@ -57,24 +65,24 @@ def analysesettings(excel,kintone): updatesettings[key] = excel[key] return updatesettings -def createkintoneapp(name:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} +def createkintoneapp(name:str,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} data = {"name":name} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json" r = httpx.post(url,headers=headers,data=json.dumps(data)) return r.json() -def updateappsettingstokintone(app:str,updates:dict): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/settings.json" +def updateappsettingstokintone(app:str,updates:dict,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/settings.json" data = {"app":app} data.update(updates) r = httpx.put(url,headers=headers,data=json.dumps(data)) return r.json() -def addfieldstokintone(app:str,fields:dict,revision:str = None): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" +def addfieldstokintone(app:str,fields:dict,c:config.KINTONE_ENV,revision:str = None): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json" if revision != None: data = {"app":app,"revision":revision,"properties":fields} else: @@ -82,32 +90,32 @@ def addfieldstokintone(app:str,fields:dict,revision:str = None): r = httpx.post(url,headers=headers,data=json.dumps(data)) return r.json() -def updatefieldstokintone(app:str,revision:str,fields:dict): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" +def updatefieldstokintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json" data = {"app":app,"properties":fields} r = httpx.put(url,headers=headers,data=json.dumps(data)) return r.json() -def deletefieldsfromkintone(app:str,revision:str,fields:dict): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/form/fields.json" +def deletefieldsfromkintone(app:str,revision:str,fields:dict,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/form/fields.json" params = {"app":app,"revision":revision,"fields":fields} #r = httpx.delete(url,headers=headers,content=json.dumps(params)) r = httpx.request(method="DELETE",url=url,headers=headers,content=json.dumps(params)) return r.json() -def deoployappfromkintone(app:str,revision:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/deploy.json" +def deoployappfromkintone(app:str,revision:str,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json" data = {"apps":[{"app":app,"revision":revision}],"revert": False} r = httpx.post(url,headers=headers,data=json.dumps(data)) return r.json -def getfieldsfromkintone(app): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +def getfieldsfromkintone(app:str,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} params = {"app":app} - url = f"{c.BASE_URL}{c.API_V1_STR}/app/form/fields.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/app/form/fields.json" r = httpx.get(url,headers=headers,params=params) return r.json() @@ -131,10 +139,10 @@ def analysefields(excel,kintone): return {"update":updatefields,"add":addfields,"del":delfields} -def getprocessfromkintone(app:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +def getprocessfromkintone(app:str,c:config.KINTONE_ENV): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} params = {"app":app} - url = f"{c.BASE_URL}{c.API_V1_STR}/app/status.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/app/status.json" r = httpx.get(url,headers=headers,params=params) return r.json() @@ -198,36 +206,36 @@ def analysprocess(excel,kintone): # return True return diff -def updateprocesstokintone(app:str,process:dict): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/status.json" +def updateprocesstokintone(app:str,process:dict,c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/status.json" data = {"app":app,"enable":True} data.update(process) r = httpx.put(url,headers=headers,data=json.dumps(data)) return r.json() -def getkintoneusers(): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +def getkintoneusers(c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} url = f"{c.BASE_URL}/v1/users.json" r = httpx.get(url,headers=headers) return r.json() -def getkintoneorgs(): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +def getkintoneorgs(c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} params = {"code":c.KINTONE_USER} url = f"{c.BASE_URL}/v1/user/organizations.json" r = httpx.get(url,headers=headers,params=params) return r.json() -def uploadkintonefiles(file): +def uploadkintonefiles(file,c:config.KINTONE_ENV=Depends(getkintoneenv)): upload_files = {'file': open(file,'rb')} - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} data ={'name':'file','filename':os.path.basename(file)} url = f"{c.BASE_URL}/k/v1/file.json" r = httpx.post(url,headers=headers,data=data,files=upload_files) return r.json() -def updateappjscss(app,uploads): +def updateappjscss(app,uploads,c:config.KINTONE_ENV=Depends(getkintoneenv)): dsjs = [] dscss = [] for upload in uploads: @@ -239,24 +247,26 @@ def updateappjscss(app,uploads): ds ={'js':dsjs,'css':dscss} mb ={'js':[],'css':[]} data = {'app':app,'scope':'ALL','desktop':ds,'mobile':mb} - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/customize.json" + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/customize.json" print(data) r = httpx.put(url,headers=headers,data=json.dumps(data)) return r.json() def createappjs(app): db = SessionLocal() - flows = get_flows_by_app(db,app) + flows = get_flows(db,app) db.close() content={} for flow in flows: content[flow.eventid] = {'flowid':flow.flowid,'name':flow.name,'content':flow.content} - js = 'const alcflow=' + json.dumps(content) - fpath = os.path.join("Temp",f"alc_setting_{app}.js") - with open(fpath,'w') as file: - file.write(js) - return fpath + js = 'const flow=' + json.dumps(content) + fpath = '{}\\alc_setting_{}.js'.format('Temp',app) + file = open(fpath,'w',encoding="utf-8") + file.write(js) + file.close() + return fpath + @r.post("/test",) async def test(file:UploadFile= File(...),app:str=None): @@ -283,14 +293,14 @@ async def test(file:UploadFile= File(...),app:str=None): @r.post("/download",) -async def download(key): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} +async def download(key,c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} params = {"fileKey":key} url = f"{c.BASE_URL}/k/v1/file.json" r = httpx.get(url,headers=headers,params=params) return r.json() -@r.post("/upload",) +@r.post("/upload") async def upload(files:t.List[UploadFile] = File(...)): dataframes = [] for file in files: @@ -308,7 +318,7 @@ async def upload(files:t.List[UploadFile] = File(...)): return {"files": [file.filename for file in files]} @r.post("/updatejscss") -async def jscss(app:str,files:t.List[UploadFile] = File(...)): +async def jscss(app:str,files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)): try: jscs=[] for file in files: @@ -323,56 +333,44 @@ async def jscss(app:str,files:t.List[UploadFile] = File(...)): jscs.append({ file.filename:upload['fileKey']}) appjscs = updateappjscss(app,jscs) if appjscs.get("revision") != None: - deoployappfromkintone(app,appjscs["revision"]) + deoployappfromkintone(app,appjscs["revision"],env) return appjscs except Exception as e: raise HTTPException(status_code=400, detail=f"Error occurred while update file {file.filename}: {str(e)}") -@r.get("/allapps",) -async def allapps(): - try: - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} - url = f"{c.BASE_URL}{c.API_V1_STR}/apps.json" - r = httpx.get(url,headers=headers,timeout=httpx.Timeout(10)) - return r.json() - except Exception as e: - print(f"異常発生しました。{type(e).__name__},{e}") - -@r.get("/app") -async def app(app:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} - url = f"{c.BASE_URL}{c.API_V1_STR}/app.json" - params ={"id":app} - r = httpx.get(url,headers=headers,params=params) +@r.get("/allapps") +async def allapps(c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} + url = f"{c.BASE_URL}{config.API_V1_STR}/apps.json" + r = httpx.get(url,headers=headers) return r.json() - @r.get("/appfields") -async def appfields(app:str): - return getfieldsfromkintone(app) +async def appfields(app:str,env = Depends(getkintoneenv)): + return getfieldsfromkintone(app,env) @r.get("/appprocess") -async def appprocess(app:str): - return getprocessfromkintone(app) +async def appprocess(app:str,env = Depends(getkintoneenv)): + return getprocessfromkintone(app,env) @r.get("/alljscss") -async def alljscs(app:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} - url = f"{c.BASE_URL}{c.API_V1_STR}/app/customize.json" +async def alljscs(app:str,c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE} + url = f"{c.BASE_URL}{config.API_V1_STR}/app/customize.json" params = {"app":app} r = httpx.get(url,headers=headers,params=params) return r.json() @r.post("/createapp",) -async def createapp(name:str): - headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} +async def createapp(name:str,c:config.KINTONE_ENV=Depends(getkintoneenv)): + headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE,"Content-Type": "application/json"} data = {"name":name} - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app.json" r = httpx.post(url,headers=headers,data=json.dumps(data)) result = r.json() if result.get("app") != None: - url = f"{c.BASE_URL}{c.API_V1_STR}/preview/app/deploy.json" + url = f"{c.BASE_URL}{config.API_V1_STR}/preview/app/deploy.json" data = {"apps":[result],"revert": False} r = httpx.post(url,headers=headers,data=json.dumps(data)) return r.json @@ -380,7 +378,7 @@ async def createapp(name:str): property=["label","code","type","required","defaultValue","options"] @r.post("/createappfromexcel",) -async def createappfromexcel(files:t.List[UploadFile] = File(...)): +async def createappfromexcel(files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)): for file in files: if file.filename.endswith('.xlsx'): try: @@ -394,18 +392,18 @@ async def createappfromexcel(files:t.List[UploadFile] = File(...)): users = getkintoneusers() orgs = getkintoneorgs() processes = getprocessfromexcel(df,users["users"], orgs["organizationTitles"]) - app = createkintoneapp(appname) + app = createkintoneapp(appname,env) if app.get("app") != None: result["app"] = app["app"] - app = updateappsettingstokintone(result["app"],{"description":desc}) + app = updateappsettingstokintone(result["app"],{"description":desc},env) if app.get("revision") != None: result["revision"] = app["revision"] - app = addfieldstokintone(result["app"],fields) + app = addfieldstokintone(result["app"],env,fields) if len(processes)> 0: app = updateprocesstokintone(result["app"],processes) if app.get("revision") != None: result["revision"] = app["revision"] - deoployappfromkintone(result["app"],result["revision"]) + deoployappfromkintone(result["app"],result["revision"],env) except Exception as e: raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}") else: @@ -414,42 +412,42 @@ async def createappfromexcel(files:t.List[UploadFile] = File(...)): return result -@r.post("/updateappfromexcel",) -async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)): +@r.post("/updateappfromexcel") +async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...),env = Depends(getkintoneenv)): for file in files: if file.filename.endswith('.xlsx'): try: content = await file.read() df = pd.read_excel(BytesIO(content)) excel = getsettingfromexcel(df) - kintone= getsettingfromkintone(app) + kintone= getsettingfromkintone(app,env) settings = analysesettings(excel,kintone) excel = getfieldsfromexcel(df) - kintone = getfieldsfromkintone(app) + kintone = getfieldsfromkintone(app,env) users = getkintoneusers() orgs = getkintoneorgs() exp = getprocessfromexcel(df,users["users"], orgs["organizationTitles"]) #exp = getprocessfromexcel(df) - kinp = getprocessfromkintone(app) + kinp = getprocessfromkintone(app,env) process = analysprocess(exp,kinp) revision = kintone["revision"] fields = analysefields(excel,kintone["properties"]) result = {"app":app,"revision":revision,"msg":"No Update"} deploy = False if len(fields["update"]) > 0: - result = updatefieldstokintone(app,revision,fields["update"]) + result = updatefieldstokintone(app,revision,fields["update"],env) revision = result["revision"] deploy = True if len(fields["add"]) > 0: - result = addfieldstokintone(app,fields["add"],revision) + result = addfieldstokintone(app,fields["add"],env,revision) revision = result["revision"] deploy = True if len(fields["del"]) > 0: - result = deletefieldsfromkintone(app,revision,fields["del"]) + result = deletefieldsfromkintone(app,revision,fields["del"],env) revision = result["revision"] deploy = True if len(settings) > 0: - result = updateappsettingstokintone(app,settings) + result = updateappsettingstokintone(app,settings,env) revision = result["revision"] deploy = True if len(process)>0: @@ -457,7 +455,7 @@ async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)): revision = result["revision"] deploy = True if deploy: - result = deoployappfromkintone(app,revision) + result = deoployappfromkintone(app,revision,env) except Exception as e: raise HTTPException(status_code=400, detail=f"Error occurred while parsing file {file.filename}: {str(e)}") else: @@ -466,11 +464,11 @@ async def updateappfromexcel(app:str,files:t.List[UploadFile] = File(...)): return result @r.post("/updateprocessfromexcel",) -async def updateprocessfromexcel(app:str): +async def updateprocessfromexcel(app:str,env = Depends(getkintoneenv)): try: excel = getprocessfromexcel() - kintone = getprocessfromkintone(app) + kintone = getprocessfromkintone(app,env) revision = kintone["revision"] #fields = analysefields(excel,kintone["properties"]) result = {"app":app,"revision":revision,"msg":"No Update"} @@ -495,7 +493,7 @@ async def updateprocessfromexcel(app:str): revision = result["revision"] deploy = True if deploy: - result = deoployappfromkintone(app,revision) + result = deoployappfromkintone(app,revision,env) except Exception as e: raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}") @@ -503,22 +501,20 @@ async def updateprocessfromexcel(app:str): @r.post("/createjstokintone",) -async def createjstokintone(app:str): +async def createjstokintone(app:str,env = Depends(getkintoneenv)): try: jscs=[] files=[] files.append(createappjs(app)) - base_dir = os.path.abspath('Temp') - runtimeJs = os.path.join(base_dir, 'alc_runtime.js') - files.append(runtimeJs) + files.append('Temp\\alc_runtime.js') for file in files: upload = uploadkintonefiles(file) if upload.get('fileKey') != None: jscs.append({ app + '.js':upload['fileKey']}) appjscs = updateappjscss(app,jscs) if appjscs.get("revision") != None: - deoployappfromkintone(app,appjscs["revision"]) + deoployappfromkintone(app,appjscs["revision"],env) return appjscs except Exception as e: - raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}") \ No newline at end of file + raise HTTPException(status_code=400, detail=f"Error occurred : {str(e)}") diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index af4cf31..b46be9a 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -4,6 +4,7 @@ from app.db.session import get_db from app.db.crud import * from app.db.schemas import * from typing import List +from app.core.auth import get_current_active_user,get_current_user platform_router = r = APIRouter() @@ -184,16 +185,16 @@ async def domain_delete( return delete_domain(db,id) @r.get( - "/domain/{userid}", + "/domain", response_model=List[Domain], response_model_exclude_none=True, ) async def userdomain_details( request: Request, - userid: str, + user=Depends(get_current_user), db=Depends(get_db), ): - domains = get_domain(db, userid) + domains = get_domain(db, user.id) return domains @r.post( @@ -222,29 +223,30 @@ async def userdomain_delete( @r.get( - "/activedomain/{userid}", + "/activedomain", response_model=Domain, response_model_exclude_none=True, ) async def get_useractivedomain( request: Request, - userid: int, + user=Depends(get_current_user), db=Depends(get_db), ): - domain = get_activedomain(db, userid) + domain = get_activedomain(db, user.id) return domain @r.put( - "/activedomain/{userid}/{domainid}", + "/activedomain/{domainid}", response_model_exclude_none=True, ) async def update_activeuserdomain( request: Request, userid: int, domainid:int, + user=Depends(get_current_user), db=Depends(get_db), ): - domain = active_userdomain(db, userid,domainid) + domain = active_userdomain(db, user.id,domainid) return domain diff --git a/backend/app/core/auth.py b/backend/app/core/auth.py index 7af62c4..b43ebd5 100644 --- a/backend/app/core/auth.py +++ b/backend/app/core/auth.py @@ -3,7 +3,7 @@ from fastapi import Depends, HTTPException, status from jwt import PyJWTError from app.db import models, schemas, session -from app.db.crud import get_user_by_email, create_user +from app.db.crud import get_user_by_email, create_user,get_user from app.core import security @@ -19,14 +19,14 @@ async def get_current_user( payload = jwt.decode( token, security.SECRET_KEY, algorithms=[security.ALGORITHM] ) - email: str = payload.get("sub") - if email is None: + id: int = payload.get("sub") + if id is None: raise credentials_exception permissions: str = payload.get("permissions") - token_data = schemas.TokenData(email=email, permissions=permissions) + token_data = schemas.TokenData(id = id, permissions=permissions) except PyJWTError: raise credentials_exception - user = get_user_by_email(db, token_data.email) + user = get_user(db, token_data.id) if user is None: raise credentials_exception return user diff --git a/backend/app/core/config.py b/backend/app/core/config.py index df37913..cafad92 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -1,18 +1,25 @@ import os +import base64 PROJECT_NAME = "KintoneAppBuilder" SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" -BASE_URL = "https://mfu07rkgnb7c.cybozu.com" - API_V1_STR = "/k/v1" API_V1_AUTH_KEY = "X-Cybozu-Authorization" -API_V1_AUTH_VALUE = "TVhaOm1heHoxMjA1" - -KINTONE_USER = "MXZ" - KINTONE_FIELD_TYPE=["GROUP","GROUP_SELECT","CHECK_BOX","SUBTABLE","DROP_DOWN","USER_SELECT","RADIO_BUTTON","RICH_TEXT","LINK","REFERENCE_TABLE","CALC","TIME","NUMBER","ORGANIZATION_SELECT","FILE","DATETIME","DATE","MULTI_SELECT","SINGLE_LINE_TEXT","MULTI_LINE_TEXT"] +class KINTONE_ENV: + + BASE_URL = "" + + API_V1_AUTH_VALUE = "" + + KINTONE_USER = "" + + def __init__(self,domain) -> None: + self.BASE_URL = domain.url + self.KINTONE_USER = domain.kintoneuser + self.API_V1_AUTH_VALUE = base64.b64encode(bytes(f"{domain.kintoneuser}:{domain.kintonepwd}","utf-8")) \ No newline at end of file diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index cf1322e..aae9059 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -46,6 +46,7 @@ class Token(BaseModel): class TokenData(BaseModel): + id:int = 0 email: str = None permissions: str = "user" diff --git a/frontend/src/pages/UserDomain.vue b/frontend/src/pages/UserDomain.vue index 11f1abb..95a7fb8 100644 --- a/frontend/src/pages/UserDomain.vue +++ b/frontend/src/pages/UserDomain.vue @@ -223,7 +223,7 @@ const newDomain = () => { const activeDomain = (id:number) => { - api.put(`http://127.0.0.1:8000/api/activedomain/1/`+ id).then(() =>{ + api.put(`http://127.0.0.1:8000/api/activedomain/`+ id).then(() =>{ getDomain(); }) }; @@ -248,16 +248,16 @@ const closeDg = (val:string) => { { dodmainids.push(domains[key].id); } - api.post(`http://127.0.0.1:8000/api/domain/1`, dodmainids).then(() =>{getDomain();}); + api.post(`http://127.0.0.1:8000/api/domain`, dodmainids).then(() =>{getDomain();}); } }; const getDomain = () => { - api.get(`http://127.0.0.1:8000/api/activedomain/1`).then(res => { + api.get(`http://127.0.0.1:8000/api/activedomain`).then(res => { activedomainid.value = res.data.id; authStore.changedomain(res.data.name); }); - api.get(`http://127.0.0.1:8000/api/domain/1`).then(res => { + api.get(`http://127.0.0.1:8000/api/domain`).then(res => { rows.length = 0; res.data.forEach((item) => { rows.push({ id:item.id,name: item.name, url: item.url, kintoneuser: item.kintoneuser, kintonepwd: item.kintonepwd}); diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index 03e0e1a..8900a93 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -7,7 +7,6 @@ export const useAuthStore = defineStore({ id: 'auth', state: () => ({ token: localStorage.getItem('token'), - id:localStorage.getItem('id'), name:localStorage.getItem('name'), domain:localStorage.getItem('domain'), returnUrl: '' @@ -21,12 +20,12 @@ export const useAuthStore = defineStore({ const result = await api.post(`http://127.0.0.1:8000/api/token`,params); console.info(result); this.token =result.data.access_token; - this.id = result.data.user_id; this.name = result.data.user_name; localStorage.setItem('token', result.data.access_token); localStorage.setItem('id', result.data.user_id); localStorage.setItem('name', result.data.user_name); - const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain/`+this.id); + const config = {headers:{Authorization : 'Bearer ' + this.token}}; + const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain`,config); this.domain = activedomain.data.name; localStorage.setItem('domain', activedomain.data.name); Router.push(this.returnUrl || '/'); From 086b5e262128a975564e68f25c0eb130fdbb3069 Mon Sep 17 00:00:00 2001 From: "maxiaozhe@alicorns.co.jp" Date: Sat, 4 Nov 2023 15:15:35 +0900 Subject: [PATCH 4/7] Azure env --- backend/app/core/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index df37913..cfd4445 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -2,7 +2,8 @@ import os PROJECT_NAME = "KintoneAppBuilder" -SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" +# SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" +SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" BASE_URL = "https://mfu07rkgnb7c.cybozu.com" From 2538e4526fd6f66fa47d04229a1d5107de890d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Sat, 4 Nov 2023 17:13:44 +0900 Subject: [PATCH 5/7] first&last name --- backend/app/api/api_v1/routers/auth.py | 3 ++- backend/app/api/api_v1/routers/platform.py | 1 - backend/app/core/auth.py | 4 +++- backend/app/db/schemas.py | 2 ++ frontend/src/stores/useAuthStore.ts | 1 - 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/app/api/api_v1/routers/auth.py b/backend/app/api/api_v1/routers/auth.py index 9f9c2d0..b0e1ffe 100644 --- a/backend/app/api/api_v1/routers/auth.py +++ b/backend/app/api/api_v1/routers/auth.py @@ -38,9 +38,10 @@ async def login( @r.post("/signup") async def signup( + firstname:str, lastname:str, db=Depends(get_db), form_data: OAuth2PasswordRequestForm = Depends() ): - user = sign_up_new_user(db, form_data.username, form_data.password) + user = sign_up_new_user(db, form_data.username, form_data.password,firstname,lastname) if not user: raise HTTPException( status_code=status.HTTP_409_CONFLICT, diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index b46be9a..b24f9fd 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -241,7 +241,6 @@ async def get_useractivedomain( ) async def update_activeuserdomain( request: Request, - userid: int, domainid:int, user=Depends(get_current_user), db=Depends(get_db), diff --git a/backend/app/core/auth.py b/backend/app/core/auth.py index b43ebd5..60d06b4 100644 --- a/backend/app/core/auth.py +++ b/backend/app/core/auth.py @@ -58,7 +58,7 @@ def authenticate_user(db, email: str, password: str): return user -def sign_up_new_user(db, email: str, password: str): +def sign_up_new_user(db, email: str, password: str, firstname: str,lastname: str): user = get_user_by_email(db, email) if user: return False # User already exists @@ -67,6 +67,8 @@ def sign_up_new_user(db, email: str, password: str): schemas.UserCreate( email=email, password=password, + firstname = firstname, + lastname = lastname, is_active=True, is_superuser=False, ), diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index aae9059..e96484a 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -21,6 +21,8 @@ class UserOut(UserBase): class UserCreate(UserBase): password: str + first_name: str + last_name: str class Config: orm_mode = True diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index 8900a93..c071af7 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -22,7 +22,6 @@ export const useAuthStore = defineStore({ this.token =result.data.access_token; this.name = result.data.user_name; localStorage.setItem('token', result.data.access_token); - localStorage.setItem('id', result.data.user_id); localStorage.setItem('name', result.data.user_name); const config = {headers:{Authorization : 'Bearer ' + this.token}}; const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain`,config); From 354fc6868d3549ee5d2997e82a47decef1f343fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Sat, 4 Nov 2023 17:15:17 +0900 Subject: [PATCH 6/7] remove id from localStorage --- frontend/src/stores/useAuthStore.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index c071af7..ab48502 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -38,7 +38,6 @@ export const useAuthStore = defineStore({ logout() { this.token = null; localStorage.removeItem('token'); - localStorage.removeItem('id'); localStorage.removeItem('name'); localStorage.removeItem('domain'); Router.push('/login'); From 761eb4c13e8345f9b67b605cac42319326301372 Mon Sep 17 00:00:00 2001 From: "maxiaozhe@alicorns.co.jp" Date: Sat, 4 Nov 2023 17:16:57 +0900 Subject: [PATCH 7/7] API token --- backend/app/core/config.py | 4 ++-- frontend/src/stores/useAuthStore.ts | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 3e63024..0bf8927 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -3,8 +3,8 @@ import base64 PROJECT_NAME = "KintoneAppBuilder" -# SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" -SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" +SQLALCHEMY_DATABASE_URI = "postgres://maxz64:m@xz1205@alicornkintone.postgres.database.azure.com/postgres" +#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" API_V1_STR = "/k/v1" diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index 8900a93..8601e02 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -5,12 +5,18 @@ import { Router } from '../router'; export const useAuthStore = defineStore({ id: 'auth', - state: () => ({ - token: localStorage.getItem('token'), - name:localStorage.getItem('name'), - domain:localStorage.getItem('domain'), - returnUrl: '' - }), + state: () =>{ + const token=localStorage.getItem('token'); + if(token && token!==''){ + api.defaults.headers["Authorization"]='Bearer ' + token; + } + return { + token: token, + name:localStorage.getItem('name'), + domain:localStorage.getItem('domain'), + returnUrl: '' + } + }, actions: { async login(username:string, password:string) { const params = new URLSearchParams(); @@ -24,8 +30,9 @@ export const useAuthStore = defineStore({ localStorage.setItem('token', result.data.access_token); localStorage.setItem('id', result.data.user_id); localStorage.setItem('name', result.data.user_name); - const config = {headers:{Authorization : 'Bearer ' + this.token}}; - const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain`,config); + // const config = {headers:{Authorization : 'Bearer ' + this.token}}; + api.defaults.headers["Authorization"]='Bearer ' + this.token; + const activedomain = await api.get(`http://127.0.0.1:8000/api/activedomain`); this.domain = activedomain.data.name; localStorage.setItem('domain', activedomain.data.name); Router.push(this.returnUrl || '/');