From 2ffa1d9438edfded9f66f935e75b23e96993ff17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Tue, 5 Nov 2024 12:01:22 +0900 Subject: [PATCH 1/3] python3.12.4 --- .gitignore | 4 ++++ backend/app/core/config.py | 2 +- backend/requirements.txt | Bin 2516 -> 1544 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1230031..8a8b253 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ .vscode .mypy_cache docker-stack.yml +backend/pyvenv.cfg +backend/Include/ +backend/Scripts/ + diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 272c317..ea058d3 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -5,7 +5,7 @@ import base64 PROJECT_NAME = "KintoneAppBuilder" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/dev" -SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" +SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://kabAdmin:P%40ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/test" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@ktune-prod-db.postgres.database.azure.com/postgres" API_V1_STR = "/k/v1" diff --git a/backend/requirements.txt b/backend/requirements.txt index 9973b3975d2c953d6571cba280c4bd9ce016846f..adbe7e4c3883b4be99aa5822af828b5779e7c3ed 100644 GIT binary patch literal 1544 zcmZvcL2uJQ5QXQA#7_yTozTL816RZW1QN$8aoi@VV;kF{q(2^b-^{KDOenZEc~yCt+(F9e*Y4%?18sd!2x5 zrT<@R!Po15qs|u2yAh_*w-@gq){F)jh)N2L)*!X)3%>Bh?jW|k-D$C3YNvF?H$p9E z+}(^QoExuM0sYDz{5+>X+_=BWy|K5DyS>&){*TJ3_DoQu^5rvZ3)R{Pd#`hCN-4De zS6--!+VOug<{CTkbVAUdwYx+!Ql&eUr_(EkPHNzK+oil#?kzlm-AV@~sv#5fs2N1$ zai{Zi2$sk+_6nbgmFI#AJgxU;a+b&-v+TrH%w7w38};nOJ&C*Wnrg?83o6&no)JIi z^QF&L>AQ5HO*w>S@IHv|U>hY)P0TL|#hKQ7)~8Hjy675-kSwVTs^z3UkNO=IXsE=9N_P*kk3YI}tJUdiG*|niMI|J#Qa1uW$_*Ly>S;ME zz7?hrGB6-e9^CaXqsmk_72~*-3NxO4!;-7IMBHBVC2GW5RPjlCAMBfby0LV0bDG|!H)$r@bJ}Lhx!z9ooD|D0ZDb|xCAIq8 zDO2|c1ShgrBMf&!QKu(8pj{n(1}t~7wdo+7yKH@Z z0<{s>D85biM~@4gL#3{#7J9fK4=AV>B!jh8_9i{(!9JD6wN#n2DqZGkYk7nZTvmy5 zBFnO1n2(Th%2|m8CAD(GWsZg`I#K5euuW7$qvs(0dv##0oa-DxCTfq)A06%v_X{gWFA7WWTNYWtPrz?VRiC?{!XHvZ0SQ=YvagK_&QrhAQBS zTHy#xRt)S+(q4F0nM?YDmvcmY4?^3?bEaJG2{-6b;fR+c&w!+37&BQHOqDN%2Ztz%V{$ppschrWJZDw|O z|NfP&lg$-J9ZYg$_I#u0P6{B?pg;VqFPQ6vY*E-SQ?3^_wu+;BY`lq{js8}u3FQPc z#GHvE`*+HOF1N}#=mE97FCGK$R*4k`-?gG#GwhO|ZcmHO@UT|dkHam(Ou)Mle3sWj zi0L8fjx6lWU`&A=7sDX7 zmdHjQqfcXh&)BffoHu60CwrPF!q_V#dCi&8zywcpm+Zd_2XT+k-K{#rPV)p?$xUGk zyQdUBus!Q6bTsC3I=a(ZO=m6suTt%ZmDW-*zaR$nSfy84RsZvwq;Hv@RjCVJPV=N&iQeh0ax=g5iSw-`CfObGuaDtI zv)aPOZN@A(ht=j=$h&~*cf!og!3OxDQ}+3+b!LVA?I`?*n}e=dJ-#W2Ujg2mz53$c y8h5HGc$? Date: Tue, 5 Nov 2024 15:35:40 +0900 Subject: [PATCH 2/3] add app table --- backend/app/api/api_v1/routers/platform.py | 29 +++++++++++++++++++++ backend/app/db/crud.py | 23 ++++++++++++++++ backend/app/db/models.py | 11 ++++++++ backend/app/db/schemas.py | 29 ++++++++++++++------- backend/requirements.txt | Bin 1544 -> 1574 bytes 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index 53937a6..9bfa1b3 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -9,6 +9,35 @@ from app.core.apiexception import APIException platform_router = r = APIRouter() + +@r.get( + "/apps", + response_model=List[AppList], + response_model_exclude_none=True, +) +async def apps_list( + request: Request, + db=Depends(get_db), +): + try: + app = get_apps(db) + return app + except Exception as e: + raise APIException('platform:apps',request.url._url,f"Error occurred while get apps:",e) + +@r.post("/apps", response_model=AppList, response_model_exclude_none=True) +async def apps_update( + request: Request, + app: AppVersion, + user=Depends(get_current_user), + db=Depends(get_db), +): + try: + return update_appversion(db, app,user.id) + except Exception as e: + raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e) + + @r.get( "/appsettings/{id}", response_model=App, diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index c26073b..0e91984 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -69,6 +69,29 @@ def edit_user( db.refresh(db_user) return db_user +def get_apps( + db: Session +) -> t.List[schemas.AppList]: + return db.query(models.App).all() + +def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int): + app = db.query(models.App).filter(and_(models.App.domainurl == appedit.domainurl,models.App.appid == appedit.appid)).first() + if app: + app.version = app.version + 1 + db_app = app + else: + db_app = models.App( + domainurl = appedit.domainurl, + appid=appedit.appid, + appname=appedit.appname, + version = 1, + updateuser= userid + ) + + db.add(db_app) + db.commit() + db.refresh(db_app) + return db_app def get_appsetting(db: Session, id: int): app = db.query(models.AppSetting).get(id) diff --git a/backend/app/db/models.py b/backend/app/db/models.py index b49b0d3..788877c 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -1,5 +1,6 @@ from sqlalchemy import Boolean, Column, Integer, String, DateTime,ForeignKey from sqlalchemy.ext.declarative import as_declarative +from sqlalchemy.orm import relationship from datetime import datetime from app.core.security import chacha20Decrypt @@ -20,6 +21,16 @@ class User(Base): is_active = Column(Boolean, default=True) is_superuser = Column(Boolean, default=False) +class App(Base): + __tablename__ = "app" + + domainurl = Column(String(200), nullable=False) + appname = Column(String(200), nullable=False) + appid = Column(String(100), index=True, nullable=False) + version = Column(Integer) + updateuser = Column(Integer,ForeignKey("user.id")) + user = relationship('User') + class AppSetting(Base): __tablename__ = "appsetting" diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index e03eea5..232bd53 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -28,21 +28,21 @@ class UserCreate(UserBase): is_active:bool is_superuser:bool - class Config: + class ConfigDict: orm_mode = True class UserEdit(UserBase): password: t.Optional[str] = None - class Config: + class ConfigDict: orm_mode = True class User(UserBase): id: int - class Config: + class ConfigDict: orm_mode = True @@ -50,6 +50,17 @@ class Token(BaseModel): access_token: str token_type: str +class AppList(Base): + domainurl: str + appname: str + appid:str + version:int + user:UserOut + +class AppVersion(BaseModel): + domainurl: str + appname: str + appid:str class TokenData(BaseModel): id:int = 0 @@ -68,7 +79,7 @@ class AppBase(BaseModel): class App(AppBase): id: int - class Config: + class ConfigDict: orm_mode = True @@ -79,7 +90,7 @@ class Kintone(BaseModel): desc: str = None content: str = None - class Config: + class ConfigDict: orm_mode = True class Action(BaseModel): @@ -92,7 +103,7 @@ class Action(BaseModel): categoryid: int = None nosort: int categoryname : str =None - class Config: + class ConfigDict: orm_mode = True class FlowBase(BaseModel): @@ -111,7 +122,7 @@ class Flow(Base): name: str = None content: str = None - class Config: + class ConfigDict: orm_mode = True class DomainBase(BaseModel): @@ -133,7 +144,7 @@ class Domain(Base): url: str kintoneuser: str kintonepwd: str - class Config: + class ConfigDict: orm_mode = True class Event(Base): @@ -145,7 +156,7 @@ class Event(Base): mobile: bool eventgroup: bool - class Config: + class ConfigDict: orm_mode = True class ErrorCreate(BaseModel): diff --git a/backend/requirements.txt b/backend/requirements.txt index adbe7e4c3883b4be99aa5822af828b5779e7c3ed..5e01eb39b9dfd716d56b72746b1c7396425608c3 100644 GIT binary patch delta 32 mcmeC+S;jM=Of;FHh@q09fT4uJ76?rk^cV~n^fu1StRj From dd814993f1a94c20c7818882e6ef7217ac4478d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=20=E6=9F=8F?= Date: Sat, 9 Nov 2024 15:56:13 +0900 Subject: [PATCH 3/3] flow domainid->domainurl add app flowhistory --- backend/app/api/api_v1/routers/platform.py | 41 +++++++++++++++++++--- backend/app/core/config.py | 2 +- backend/app/db/crud.py | 29 +++++++++++---- backend/app/db/models.py | 25 ++++++++++++- backend/app/db/schemas.py | 2 +- 5 files changed, 86 insertions(+), 13 deletions(-) diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index 9bfa1b3..82fa504 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -1,4 +1,5 @@ from fastapi import Query, Request,Depends, APIRouter, UploadFile,HTTPException,File +from app.core.operation import log_operation from app.db import Base,engine from app.db.session import get_db from app.db.crud import * @@ -7,6 +8,9 @@ from typing import List, Optional from app.core.auth import get_current_active_user,get_current_user from app.core.apiexception import APIException +import httpx +import app.core.config as config + platform_router = r = APIRouter() @@ -17,11 +21,40 @@ platform_router = r = APIRouter() ) async def apps_list( request: Request, + user = Depends(get_current_user), db=Depends(get_db), ): try: - app = get_apps(db) - return app + platformapps = get_apps(db) + domain = get_activedomain(db, user.id) + + kintoneevn = config.KINTONE_ENV(domain) + headers={config.API_V1_AUTH_KEY:kintoneevn.API_V1_AUTH_VALUE} + url = f"{kintoneevn.BASE_URL}{config.API_V1_STR}/apps.json" + offset = 0 + limit = 100 + all_apps = [] + + while True: + r = httpx.get(f"{url}?limit={limit}&offset={offset}", headers=headers) + json_data = r.json() + apps = json_data.get("apps",[]) + all_apps.extend(apps) + if len(apps)",domain) - flows = get_flows_by_app(db, domain.id, appid) + flows = get_flows_by_app(db, domain.url, appid) return flows except Exception as e: raise APIException('platform:flow',request.url._url,f"Error occurred while get flow by appid:",e) @@ -173,7 +206,7 @@ async def flow_create( ): try: domain = get_activedomain(db, user.id) - return create_flow(db, domain.id, flow) + return create_flow(db, domain.url, flow) except Exception as e: raise APIException('platform:flow',request.url._url,f"Error occurred while create flow:",e) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index ea058d3..9326127 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -5,7 +5,7 @@ import base64 PROJECT_NAME = "KintoneAppBuilder" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/dev" -SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://kabAdmin:P%40ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres" +SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://kabAdmin:P%40ssw0rd!@kintonetooldb.postgres.database.azure.com/dev_v2" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/test" #SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@ktune-prod-db.postgres.database.azure.com/postgres" API_V1_STR = "/k/v1" diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index 0e91984..8970081 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -79,16 +79,33 @@ def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int): if app: app.version = app.version + 1 db_app = app + appver = app.version else: + appver = 1 db_app = models.App( domainurl = appedit.domainurl, appid=appedit.appid, appname=appedit.appname, version = 1, updateuser= userid - ) - + ) + db.add(db_app) + + flows = db.query(models.Flow).filter(and_(models.Flow.domainurl == appedit.domainurl,models.App.appid == appedit.appid)) + for flow in flows: + db_flowhistory = models.FlowHistory( + flowid = flow.flowid, + appid = flow.appid, + eventid = flow.eventid, + domainurl = flow.domainurl, + name = flow.name, + content = flow.content, + createuser = userid, + version = appver + ) + db.add(db_flowhistory) + db.commit() db.refresh(db_app) return db_app @@ -148,12 +165,12 @@ def get_actions(db: Session): return actions -def create_flow(db: Session, domainid: int, flow: schemas.FlowBase): +def create_flow(db: Session, domainurl: str, flow: schemas.FlowBase): db_flow = models.Flow( flowid=flow.flowid, appid=flow.appid, eventid=flow.eventid, - domainid=domainid, + domainurl=domainurl, name=flow.name, content=flow.content ) @@ -200,8 +217,8 @@ def get_flow(db: Session, flowid: str): raise HTTPException(status_code=404, detail="Data not found") return flow -def get_flows_by_app(db: Session, domainid: int, appid: str): - flows = db.query(models.Flow).filter(and_(models.Flow.domainid == domainid,models.Flow.appid == appid)).all() +def get_flows_by_app(db: Session,domainurl: str, appid: str): + flows = db.query(models.Flow).filter(and_(models.Flow.domainurl == domainurl,models.Flow.appid == appid)).all() if not flows: raise Exception("Data not found") return flows diff --git a/backend/app/db/models.py b/backend/app/db/models.py index 788877c..f710c17 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -62,10 +62,22 @@ class Flow(Base): flowid = Column(String(100), index=True, nullable=False) appid = Column(String(100), index=True, nullable=False) eventid = Column(String(100), index=True, nullable=False) - domainid = Column(Integer,ForeignKey("domain.id")) + domainurl = Column(String(200)) name = Column(String(200)) content = Column(String) +class FlowHistory(Base): + __tablename__ = "flowhistory" + + flowid = Column(String(100), index=True, nullable=False) + appid = Column(String(100), index=True, nullable=False) + eventid = Column(String(100), index=True, nullable=False) + domainurl = Column(String(200)) + name = Column(String(200)) + content = Column(String) + createuser = Column(Integer,ForeignKey("user.id")) + version = Column(Integer) + class Tenant(Base): __tablename__ = "tenant" @@ -119,6 +131,17 @@ class ErrorLog(Base): location = Column(String(500)) content = Column(String(5000)) +class OperationLog(Base): + __tablename__ = "operationlog" + + tenantid = Column(String(100)) + domainurl = Column(String(200)) + userid = Column(Integer,ForeignKey("user.id")) + operation = Column(String(200)) + function = Column(String(200)) + detail = Column(String(200)) + user = relationship('User') + class KintoneFormat(Base): __tablename__ = "kintoneformat" diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py index 232bd53..992e406 100644 --- a/backend/app/db/schemas.py +++ b/backend/app/db/schemas.py @@ -118,7 +118,7 @@ class Flow(Base): flowid: str appid: str eventid: str - domainid: int + domainurl: str name: str = None content: str = None