Compare commits
2 Commits
feature-xj
...
devForBF2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1626091e36 | ||
| fa1d3b01b0 |
@@ -25,11 +25,15 @@ async def login(
|
|||||||
minutes=security.ACCESS_TOKEN_EXPIRE_MINUTES
|
minutes=security.ACCESS_TOKEN_EXPIRE_MINUTES
|
||||||
)
|
)
|
||||||
if user.is_superuser:
|
if user.is_superuser:
|
||||||
permissions = "admin"
|
roles = "super"
|
||||||
|
permissions = "ALL"
|
||||||
else:
|
else:
|
||||||
permissions = "user"
|
roles = ";".join(role.name for role in user.roles)
|
||||||
|
perlst = [perm.privilege for role in user.roles for perm in role.permissions]
|
||||||
|
permissions =";".join(list(set(perlst)))
|
||||||
|
|
||||||
access_token = security.create_access_token(
|
access_token = security.create_access_token(
|
||||||
data={"sub": user.id, "permissions": permissions},
|
data={"sub": user.id, "roles":roles,"permissions": permissions ,},
|
||||||
expires_delta=access_token_expires,
|
expires_delta=access_token_expires,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ platform_router = r = APIRouter()
|
|||||||
)
|
)
|
||||||
async def apps_list(
|
async def apps_list(
|
||||||
request: Request,
|
request: Request,
|
||||||
user = Depends(get_current_user),
|
user = Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -60,7 +60,7 @@ async def apps_list(
|
|||||||
async def apps_update(
|
async def apps_update(
|
||||||
request: Request,
|
request: Request,
|
||||||
app: AppVersion,
|
app: AppVersion,
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -68,6 +68,20 @@ async def apps_update(
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e)
|
raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e)
|
||||||
|
|
||||||
|
@r.delete(
|
||||||
|
"/apps/{domainurl}/{appid}", response_model_exclude_none=True
|
||||||
|
)
|
||||||
|
async def apps_delete(
|
||||||
|
request: Request,
|
||||||
|
domainurl:str,
|
||||||
|
appid: str,
|
||||||
|
user=Depends(get_current_active_user),
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
return delete_apps(db, domainurl,appid)
|
||||||
|
except Exception as e:
|
||||||
|
raise APIException('platform:apps',request.url._url,f"Error occurred while delete apps({domainurl}:{appid}):",e)
|
||||||
|
|
||||||
@r.get(
|
@r.get(
|
||||||
"/appsettings/{id}",
|
"/appsettings/{id}",
|
||||||
@@ -183,7 +197,7 @@ async def flow_details(
|
|||||||
async def flow_list(
|
async def flow_list(
|
||||||
request: Request,
|
request: Request,
|
||||||
appid: str,
|
appid: str,
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -198,8 +212,8 @@ async def flow_list(
|
|||||||
@r.post("/flow", response_model=Flow, response_model_exclude_none=True)
|
@r.post("/flow", response_model=Flow, response_model_exclude_none=True)
|
||||||
async def flow_create(
|
async def flow_create(
|
||||||
request: Request,
|
request: Request,
|
||||||
flow: FlowBase,
|
flow: FlowIn,
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -215,13 +229,13 @@ async def flow_create(
|
|||||||
async def flow_edit(
|
async def flow_edit(
|
||||||
request: Request,
|
request: Request,
|
||||||
flowid: str,
|
flowid: str,
|
||||||
flow: FlowBase,
|
flow: FlowIn,
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
domain = get_activedomain(db, user.id)
|
domain = get_activedomain(db, user.id)
|
||||||
return edit_flow(db,domain.url, flow)
|
return edit_flow(db,domain.url, flow,user.id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise APIException('platform:flow',request.url._url,f"Error occurred while edit flow:",e)
|
raise APIException('platform:flow',request.url._url,f"Error occurred while edit flow:",e)
|
||||||
|
|
||||||
@@ -259,7 +273,7 @@ async def domain_details(
|
|||||||
async def domain_create(
|
async def domain_create(
|
||||||
request: Request,
|
request: Request,
|
||||||
domain: DomainBase,
|
domain: DomainBase,
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -274,10 +288,11 @@ async def domain_create(
|
|||||||
async def domain_edit(
|
async def domain_edit(
|
||||||
request: Request,
|
request: Request,
|
||||||
domain: DomainBase,
|
domain: DomainBase,
|
||||||
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
return edit_domain(db, domain)
|
return edit_domain(db, domain,user.id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise APIException('platform:domain',request.url._url,f"Error occurred while edit domain:",e)
|
raise APIException('platform:domain',request.url._url,f"Error occurred while edit domain:",e)
|
||||||
|
|
||||||
@@ -303,7 +318,7 @@ async def domain_delete(
|
|||||||
async def userdomain_details(
|
async def userdomain_details(
|
||||||
request: Request,
|
request: Request,
|
||||||
userId: Optional[int] = Query(None, alias="userId"),
|
userId: Optional[int] = Query(None, alias="userId"),
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -351,7 +366,7 @@ async def userdomain_delete(
|
|||||||
async def get_useractivedomain(
|
async def get_useractivedomain(
|
||||||
request: Request,
|
request: Request,
|
||||||
userId: Optional[int] = Query(None, alias="userId"),
|
userId: Optional[int] = Query(None, alias="userId"),
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
@@ -371,7 +386,7 @@ async def update_activeuserdomain(
|
|||||||
request: Request,
|
request: Request,
|
||||||
domainid:int,
|
domainid:int,
|
||||||
userId: Optional[int] = Query(None, alias="userId"),
|
userId: Optional[int] = Query(None, alias="userId"),
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_active_user),
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from fastapi import APIRouter, Request, Depends, Response, encoders
|
from fastapi import APIRouter, Request, Depends, Response, Security, encoders
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
from app.db.session import get_db
|
from app.db.session import get_db
|
||||||
@@ -8,9 +8,11 @@ from app.db.crud import (
|
|||||||
create_user,
|
create_user,
|
||||||
delete_user,
|
delete_user,
|
||||||
edit_user,
|
edit_user,
|
||||||
|
assign_userrole,
|
||||||
|
get_roles,
|
||||||
)
|
)
|
||||||
from app.db.schemas import UserCreate, UserEdit, User, UserOut
|
from app.db.schemas import UserCreate, UserEdit, User, UserOut,Role
|
||||||
from app.core.auth import get_current_active_user, get_current_active_superuser
|
from app.core.auth import get_current_user,get_current_active_user, get_current_active_superuser
|
||||||
|
|
||||||
users_router = r = APIRouter()
|
users_router = r = APIRouter()
|
||||||
|
|
||||||
@@ -23,14 +25,14 @@ users_router = r = APIRouter()
|
|||||||
async def users_list(
|
async def users_list(
|
||||||
response: Response,
|
response: Response,
|
||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
current_user=Depends(get_current_active_superuser),
|
current_user=Depends(get_current_active_user),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Get all users
|
Get all users
|
||||||
"""
|
"""
|
||||||
users = get_users(db)
|
users = get_users(db,current_user.is_superuser)
|
||||||
# This is necessary for react-admin to work
|
# This is necessary for react-admin to work
|
||||||
response.headers["Content-Range"] = f"0-9/{len(users)}"
|
#response.headers["Content-Range"] = f"0-9/{len(users)}"
|
||||||
return users
|
return users
|
||||||
|
|
||||||
|
|
||||||
@@ -105,3 +107,30 @@ async def user_delete(
|
|||||||
Delete existing user
|
Delete existing user
|
||||||
"""
|
"""
|
||||||
return delete_user(db, user_id)
|
return delete_user(db, user_id)
|
||||||
|
|
||||||
|
|
||||||
|
@r.post("/userrole",
|
||||||
|
response_model=User,
|
||||||
|
response_model_exclude_none=True,)
|
||||||
|
async def assign_role(
|
||||||
|
request: Request,
|
||||||
|
userid:int,
|
||||||
|
roles:t.List[int],
|
||||||
|
db=Depends(get_db)
|
||||||
|
):
|
||||||
|
|
||||||
|
return assign_userrole(db,userid,roles)
|
||||||
|
|
||||||
|
|
||||||
|
@r.get(
|
||||||
|
"/roles",
|
||||||
|
response_model=t.List[Role],
|
||||||
|
response_model_exclude_none=True,
|
||||||
|
)
|
||||||
|
async def roles_list(
|
||||||
|
response: Response,
|
||||||
|
db=Depends(get_db),
|
||||||
|
current_user=Security(get_current_active_user, scopes=["role_list"]),
|
||||||
|
):
|
||||||
|
roles = get_roles(db)
|
||||||
|
return roles
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
from fastapi.security import SecurityScopes
|
||||||
import jwt
|
import jwt
|
||||||
from fastapi import Depends, HTTPException, status
|
from fastapi import Depends, HTTPException, Request, Security, status
|
||||||
from jwt import PyJWTError
|
from jwt import PyJWTError
|
||||||
|
|
||||||
from app.db import models, schemas, session
|
from app.db import models, schemas, session
|
||||||
@@ -7,7 +8,7 @@ from app.db.crud import get_user_by_email, create_user,get_user
|
|||||||
from app.core import security
|
from app.core import security
|
||||||
|
|
||||||
|
|
||||||
async def get_current_user(
|
async def get_current_user(security_scopes: SecurityScopes,
|
||||||
db=Depends(session.get_db), token: str = Depends(security.oauth2_scheme)
|
db=Depends(session.get_db), token: str = Depends(security.oauth2_scheme)
|
||||||
):
|
):
|
||||||
credentials_exception = HTTPException(
|
credentials_exception = HTTPException(
|
||||||
@@ -16,13 +17,21 @@ async def get_current_user(
|
|||||||
headers={"WWW-Authenticate": "Bearer"},
|
headers={"WWW-Authenticate": "Bearer"},
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
payload = jwt.decode(
|
payload = jwt.decode(
|
||||||
token, security.SECRET_KEY, algorithms=[security.ALGORITHM]
|
token, security.SECRET_KEY, algorithms=[security.ALGORITHM]
|
||||||
)
|
)
|
||||||
id: int = payload.get("sub")
|
id: int = payload.get("sub")
|
||||||
if id is None:
|
if id is None:
|
||||||
raise credentials_exception
|
raise credentials_exception
|
||||||
|
|
||||||
permissions: str = payload.get("permissions")
|
permissions: str = payload.get("permissions")
|
||||||
|
if not permissions =="ALL":
|
||||||
|
for scope in security_scopes.scopes:
|
||||||
|
if scope not in permissions.split(";"):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=403, detail="The user doesn't have enough privileges"
|
||||||
|
)
|
||||||
token_data = schemas.TokenData(id = id, permissions=permissions)
|
token_data = schemas.TokenData(id = id, permissions=permissions)
|
||||||
except PyJWTError:
|
except PyJWTError:
|
||||||
raise credentials_exception
|
raise credentials_exception
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import datetime
|
||||||
from fastapi import HTTPException, status
|
from fastapi import HTTPException, status
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
from sqlalchemy import and_
|
from sqlalchemy import and_
|
||||||
@@ -19,9 +20,12 @@ def get_user_by_email(db: Session, email: str) -> schemas.UserBase:
|
|||||||
|
|
||||||
|
|
||||||
def get_users(
|
def get_users(
|
||||||
db: Session, skip: int = 0, limit: int = 100
|
db: Session, super:bool
|
||||||
) -> t.List[schemas.UserOut]:
|
) -> t.List[schemas.UserOut]:
|
||||||
return db.query(models.User).offset(skip).limit(limit).all()
|
if super:
|
||||||
|
return db.query(models.User).all()
|
||||||
|
else:
|
||||||
|
return db.query(models.User).filter(models.User.is_superuser == False)
|
||||||
|
|
||||||
|
|
||||||
def create_user(db: Session, user: schemas.UserCreate):
|
def create_user(db: Session, user: schemas.UserCreate):
|
||||||
@@ -69,28 +73,48 @@ def edit_user(
|
|||||||
db.refresh(db_user)
|
db.refresh(db_user)
|
||||||
return db_user
|
return db_user
|
||||||
|
|
||||||
|
|
||||||
|
def get_roles(
|
||||||
|
db: Session
|
||||||
|
) -> t.List[schemas.Role]:
|
||||||
|
return db.query(models.Role).all()
|
||||||
|
|
||||||
|
def assign_userrole( db: Session, user_id: int, roles: t.List[int]):
|
||||||
|
db_user = db.query(models.User).get(user_id)
|
||||||
|
if db_user:
|
||||||
|
for role in db_user.roles:
|
||||||
|
db_user.roles.remove(role)
|
||||||
|
for roleid in roles:
|
||||||
|
role = db.query(models.Role).get(roleid)
|
||||||
|
if role:
|
||||||
|
db_user.roles.append(role)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_user)
|
||||||
|
return db_user
|
||||||
|
|
||||||
def get_apps(
|
def get_apps(
|
||||||
db: Session,
|
db: Session,
|
||||||
domain_url:str
|
domainurl:str
|
||||||
) -> t.List[schemas.AppList]:
|
) -> t.List[schemas.AppList]:
|
||||||
return db.query(models.App).filter(models.App.domainurl == domain_url).all()
|
return db.query(models.App).filter(models.App.domainurl == domainurl).all()
|
||||||
|
|
||||||
def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int):
|
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()
|
db_app = db.query(models.App).filter(and_(models.App.domainurl == appedit.domainurl,models.App.appid == appedit.appid)).first()
|
||||||
if app:
|
if not db_app:
|
||||||
app.version = app.version + 1
|
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="User not found")
|
||||||
db_app = app
|
|
||||||
appver = app.version
|
db_app.version = db_app.version + 1
|
||||||
else:
|
appversion = models.AppVersion(
|
||||||
appver = 1
|
|
||||||
db_app = models.App(
|
|
||||||
domainurl = appedit.domainurl,
|
domainurl = appedit.domainurl,
|
||||||
appid=appedit.appid,
|
appid=appedit.appid,
|
||||||
appname=appedit.appname,
|
appname=db_app.appname,
|
||||||
version = 1,
|
version = db_app.version,
|
||||||
updateuser= userid
|
versionname = appedit.versionname,
|
||||||
)
|
comment = appedit.comment,
|
||||||
|
updateuserid = userid,
|
||||||
|
createuserid = userid
|
||||||
|
)
|
||||||
|
db.add(appversion)
|
||||||
db.add(db_app)
|
db.add(db_app)
|
||||||
|
|
||||||
flows = db.query(models.Flow).filter(and_(models.Flow.domainurl == appedit.domainurl,models.App.appid == appedit.appid))
|
flows = db.query(models.Flow).filter(and_(models.Flow.domainurl == appedit.domainurl,models.App.appid == appedit.appid))
|
||||||
@@ -103,7 +127,9 @@ def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int):
|
|||||||
name = flow.name,
|
name = flow.name,
|
||||||
content = flow.content,
|
content = flow.content,
|
||||||
createuser = userid,
|
createuser = userid,
|
||||||
version = appver
|
version = db_app.version,
|
||||||
|
updateuserid = userid,
|
||||||
|
createuserid = userid
|
||||||
)
|
)
|
||||||
db.add(db_flowhistory)
|
db.add(db_flowhistory)
|
||||||
|
|
||||||
@@ -111,6 +137,17 @@ def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int):
|
|||||||
db.refresh(db_app)
|
db.refresh(db_app)
|
||||||
return db_app
|
return db_app
|
||||||
|
|
||||||
|
def delete_apps(db: Session, domainurl: str,appid: str ):
|
||||||
|
db_app = db.query(models.App).filter(and_(models.App.domainurl == domainurl,models.App.appid ==appid)).first()
|
||||||
|
if not db_app:
|
||||||
|
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="App not found")
|
||||||
|
db.delete(db_app)
|
||||||
|
db_flows = db.query(models.Flow).filter(and_(models.Flow.domainurl == domainurl,models.Flow.appid ==appid))
|
||||||
|
for flow in db_flows:
|
||||||
|
db.delete(flow)
|
||||||
|
db.commit()
|
||||||
|
return db_app
|
||||||
|
|
||||||
def get_appsetting(db: Session, id: int):
|
def get_appsetting(db: Session, id: int):
|
||||||
app = db.query(models.AppSetting).get(id)
|
app = db.query(models.AppSetting).get(id)
|
||||||
if not app:
|
if not app:
|
||||||
@@ -166,16 +203,28 @@ def get_actions(db: Session):
|
|||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
def create_flow(db: Session, domainurl: str, flow: schemas.FlowBase):
|
def create_flow(db: Session, domainurl: str, flow: schemas.FlowIn,userid:int):
|
||||||
db_flow = models.Flow(
|
db_flow = models.Flow(
|
||||||
flowid=flow.flowid,
|
flowid=flow.flowid,
|
||||||
appid=flow.appid,
|
appid=flow.appid,
|
||||||
eventid=flow.eventid,
|
eventid=flow.eventid,
|
||||||
domainurl=domainurl,
|
domainurl=domainurl,
|
||||||
name=flow.name,
|
name=flow.name,
|
||||||
content=flow.content
|
content=flow.content,
|
||||||
|
createuserid = userid,
|
||||||
|
updateuserid = userid
|
||||||
)
|
)
|
||||||
db.add(db_flow)
|
db.add(db_flow)
|
||||||
|
db_app = db.query(models.App).filter(and_(models.App.domainurl == domainurl,models.App.appid == flow.appid)).first()
|
||||||
|
if not db_app:
|
||||||
|
db_app = models.App(
|
||||||
|
domainurl = domainurl,
|
||||||
|
appid=flow.appid,
|
||||||
|
appname=flow.appname,
|
||||||
|
version = 0,
|
||||||
|
createuserid= userid,
|
||||||
|
updateuserid = userid
|
||||||
|
)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(db_flow)
|
db.refresh(db_flow)
|
||||||
return db_flow
|
return db_flow
|
||||||
@@ -190,17 +239,20 @@ def delete_flow(db: Session, flowid: str):
|
|||||||
|
|
||||||
|
|
||||||
def edit_flow(
|
def edit_flow(
|
||||||
db: Session, domainurl: str, flow: schemas.FlowBase
|
db: Session, domainurl: str, flow: schemas.FlowIn,userid:int
|
||||||
) -> schemas.Flow:
|
) -> schemas.Flow:
|
||||||
db_flow = get_flow(db, flow.flowid)
|
db_flow = get_flow(db, flow.flowid)
|
||||||
if not db_flow:
|
if not db_flow:
|
||||||
#見つからない時新規作成
|
#見つからない時新規作成
|
||||||
return create_flow(db,domainurl,flow)
|
return create_flow(db,domainurl,flow,userid)
|
||||||
|
|
||||||
update_data = flow.dict(exclude_unset=True)
|
db_flow.appid =flow.appid,
|
||||||
|
db_flow.eventid=flow.eventid,
|
||||||
for key, value in update_data.items():
|
db_flow.domainurl=domainurl,
|
||||||
setattr(db_flow, key, value)
|
db_flow.name=flow.name,
|
||||||
|
db_flow.content=flow.content,
|
||||||
|
db_flow.updateuserid = userid,
|
||||||
|
db_flow.update_time = datetime.now
|
||||||
|
|
||||||
db.add(db_flow)
|
db.add(db_flow)
|
||||||
db.commit()
|
db.commit()
|
||||||
@@ -233,7 +285,9 @@ def create_domain(db: Session, domain: schemas.DomainBase,userid:int):
|
|||||||
name=domain.name,
|
name=domain.name,
|
||||||
url=domain.url,
|
url=domain.url,
|
||||||
kintoneuser=domain.kintoneuser,
|
kintoneuser=domain.kintoneuser,
|
||||||
kintonepwd=domain.kintonepwd
|
kintonepwd=domain.kintonepwd,
|
||||||
|
createuserid = userid,
|
||||||
|
updateuserid = userid
|
||||||
)
|
)
|
||||||
db.add(db_domain)
|
db.add(db_domain)
|
||||||
db.flush()
|
db.flush()
|
||||||
@@ -252,18 +306,19 @@ def delete_domain(db: Session,id: int):
|
|||||||
|
|
||||||
|
|
||||||
def edit_domain(
|
def edit_domain(
|
||||||
db: Session, domain: schemas.DomainBase
|
db: Session, domain: schemas.DomainBase,userid:int
|
||||||
) -> schemas.Domain:
|
) -> schemas.Domain:
|
||||||
domain.encrypt_kintonepwd()
|
domain.encrypt_kintonepwd()
|
||||||
db_domain = db.query(models.Domain).get(domain.id)
|
db_domain = db.query(models.Domain).get(domain.id)
|
||||||
if not db_domain:
|
if not db_domain:
|
||||||
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found")
|
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Domain not found")
|
||||||
update_data = domain.dict(exclude_unset=True)
|
db_domain.tenantid = domain.tenantid
|
||||||
|
db_domain.name=domain.name
|
||||||
for key, value in update_data.items():
|
db_domain.url=domain.url
|
||||||
if key != "id" and not (key == "kintonepwd" and (value is None or value == "")):
|
db_domain.kintoneuser=domain.kintoneuser
|
||||||
setattr(db_domain, key, value)
|
db_domain.kintonepwd = domain.kintonepwd
|
||||||
print(str(db_domain))
|
db_domain.updateuserid = userid
|
||||||
|
db_domain.update_time = datetime.now
|
||||||
db.add(db_domain)
|
db.add(db_domain)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(db_domain)
|
db.refresh(db_domain)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy import Boolean, Column, Integer, String, DateTime,ForeignKey
|
from sqlalchemy import Boolean, Column, Integer, String, DateTime,ForeignKey,Table
|
||||||
from sqlalchemy.ext.declarative import as_declarative
|
from sqlalchemy.ext.declarative import as_declarative
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from app.db.session import Base
|
||||||
from app.core.security import chacha20Decrypt
|
from app.core.security import chacha20Decrypt
|
||||||
|
|
||||||
@as_declarative()
|
@as_declarative()
|
||||||
@@ -11,6 +11,21 @@ class Base:
|
|||||||
create_time = Column(DateTime, default=datetime.now)
|
create_time = Column(DateTime, default=datetime.now)
|
||||||
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
||||||
|
|
||||||
|
|
||||||
|
userrole = Table(
|
||||||
|
"userrole",
|
||||||
|
Base.metadata,
|
||||||
|
Column("userid",Integer,ForeignKey("user.id")),
|
||||||
|
Column("roleid",Integer,ForeignKey("role.id")),
|
||||||
|
)
|
||||||
|
|
||||||
|
rolepermission = Table(
|
||||||
|
"rolepermission",
|
||||||
|
Base.metadata,
|
||||||
|
Column("roleid",Integer,ForeignKey("role.id")),
|
||||||
|
Column("permissionid",Integer,ForeignKey("permission.id")),
|
||||||
|
)
|
||||||
|
|
||||||
class User(Base):
|
class User(Base):
|
||||||
__tablename__ = "user"
|
__tablename__ = "user"
|
||||||
|
|
||||||
@@ -20,6 +35,25 @@ class User(Base):
|
|||||||
hashed_password = Column(String(200), nullable=False)
|
hashed_password = Column(String(200), nullable=False)
|
||||||
is_active = Column(Boolean, default=True)
|
is_active = Column(Boolean, default=True)
|
||||||
is_superuser = Column(Boolean, default=False)
|
is_superuser = Column(Boolean, default=False)
|
||||||
|
roles = relationship("Role",secondary=userrole,back_populates="users")
|
||||||
|
|
||||||
|
|
||||||
|
class Role(Base):
|
||||||
|
__tablename__ = "role"
|
||||||
|
|
||||||
|
name = Column(String(100))
|
||||||
|
description = Column(String(255))
|
||||||
|
users = relationship("User",secondary=userrole,back_populates="roles")
|
||||||
|
permissions = relationship("Permission",secondary=rolepermission,back_populates="roles")
|
||||||
|
|
||||||
|
class Permission(Base):
|
||||||
|
__tablename__ = "permission"
|
||||||
|
|
||||||
|
menu = Column(String(100))
|
||||||
|
function = Column(String(255))
|
||||||
|
privilege = Column(String(100))
|
||||||
|
roles = relationship("Role",secondary=rolepermission,back_populates="permissions")
|
||||||
|
|
||||||
|
|
||||||
class App(Base):
|
class App(Base):
|
||||||
__tablename__ = "app"
|
__tablename__ = "app"
|
||||||
@@ -28,8 +62,25 @@ class App(Base):
|
|||||||
appname = Column(String(200), nullable=False)
|
appname = Column(String(200), nullable=False)
|
||||||
appid = Column(String(100), index=True, nullable=False)
|
appid = Column(String(100), index=True, nullable=False)
|
||||||
version = Column(Integer)
|
version = Column(Integer)
|
||||||
updateuser = Column(Integer,ForeignKey("user.id"))
|
createuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
user = relationship('User')
|
updateuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
|
class AppVersion(Base):
|
||||||
|
__tablename__ = "appversion"
|
||||||
|
|
||||||
|
domainurl = Column(String(200), nullable=False)
|
||||||
|
appname = Column(String(200), nullable=False)
|
||||||
|
appid = Column(String(100), index=True, nullable=False)
|
||||||
|
version = Column(Integer)
|
||||||
|
versionname = Column(String(200), nullable=False)
|
||||||
|
comment = Column(String(200), nullable=False)
|
||||||
|
createuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
updateuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
|
|
||||||
class AppSetting(Base):
|
class AppSetting(Base):
|
||||||
__tablename__ = "appsetting"
|
__tablename__ = "appsetting"
|
||||||
@@ -65,6 +116,10 @@ class Flow(Base):
|
|||||||
domainurl = Column(String(200))
|
domainurl = Column(String(200))
|
||||||
name = Column(String(200))
|
name = Column(String(200))
|
||||||
content = Column(String)
|
content = Column(String)
|
||||||
|
createuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
updateuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
class FlowHistory(Base):
|
class FlowHistory(Base):
|
||||||
__tablename__ = "flowhistory"
|
__tablename__ = "flowhistory"
|
||||||
@@ -75,8 +130,11 @@ class FlowHistory(Base):
|
|||||||
domainurl = Column(String(200))
|
domainurl = Column(String(200))
|
||||||
name = Column(String(200))
|
name = Column(String(200))
|
||||||
content = Column(String)
|
content = Column(String)
|
||||||
createuser = Column(Integer,ForeignKey("user.id"))
|
|
||||||
version = Column(Integer)
|
version = Column(Integer)
|
||||||
|
createuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
updateuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
class Tenant(Base):
|
class Tenant(Base):
|
||||||
__tablename__ = "tenant"
|
__tablename__ = "tenant"
|
||||||
@@ -98,7 +156,10 @@ class Domain(Base):
|
|||||||
def decrypt_kintonepwd(self):
|
def decrypt_kintonepwd(self):
|
||||||
decrypted_pwd = chacha20Decrypt(self.kintonepwd)
|
decrypted_pwd = chacha20Decrypt(self.kintonepwd)
|
||||||
return decrypted_pwd
|
return decrypted_pwd
|
||||||
|
createuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
updateuserid = Column(Integer,ForeignKey("user.id"))
|
||||||
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
class UserDomain(Base):
|
class UserDomain(Base):
|
||||||
__tablename__ = "userdomain"
|
__tablename__ = "userdomain"
|
||||||
|
|||||||
@@ -8,13 +8,26 @@ class Base(BaseModel):
|
|||||||
create_time: datetime
|
create_time: datetime
|
||||||
update_time: datetime
|
update_time: datetime
|
||||||
|
|
||||||
|
|
||||||
|
class Permission(BaseModel):
|
||||||
|
id: int
|
||||||
|
menu:str
|
||||||
|
function:str
|
||||||
|
privilege:str
|
||||||
|
|
||||||
|
class Role(BaseModel):
|
||||||
|
id: int
|
||||||
|
name:str
|
||||||
|
description:str
|
||||||
|
permissions:t.List[Permission] = []
|
||||||
|
|
||||||
class UserBase(BaseModel):
|
class UserBase(BaseModel):
|
||||||
email: str
|
email: str
|
||||||
is_active: bool = True
|
is_active: bool = True
|
||||||
is_superuser: bool = False
|
is_superuser: bool = False
|
||||||
first_name: str = None
|
first_name: str = None
|
||||||
last_name: str = None
|
last_name: str = None
|
||||||
|
roles:t.List[Role] = []
|
||||||
|
|
||||||
class UserOut(UserBase):
|
class UserOut(UserBase):
|
||||||
pass
|
pass
|
||||||
@@ -54,14 +67,17 @@ class AppList(Base):
|
|||||||
domainurl: str
|
domainurl: str
|
||||||
appname: str
|
appname: str
|
||||||
appid:str
|
appid:str
|
||||||
|
updateuser: UserOut
|
||||||
version:int
|
version:int
|
||||||
user:UserOut
|
|
||||||
|
|
||||||
class AppVersion(BaseModel):
|
class AppVersion(BaseModel):
|
||||||
domainurl: str
|
domainurl: str
|
||||||
appname: str
|
appname: str
|
||||||
|
versionname: str
|
||||||
|
comment:str
|
||||||
appid:str
|
appid:str
|
||||||
|
|
||||||
|
|
||||||
class TokenData(BaseModel):
|
class TokenData(BaseModel):
|
||||||
id:int = 0
|
id:int = 0
|
||||||
email: str = None
|
email: str = None
|
||||||
@@ -106,9 +122,11 @@ class Action(BaseModel):
|
|||||||
class ConfigDict:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class FlowBase(BaseModel):
|
class FlowIn(BaseModel):
|
||||||
flowid: str
|
flowid: str
|
||||||
|
# domainurl:str
|
||||||
appid: str
|
appid: str
|
||||||
|
appname:str
|
||||||
eventid: str
|
eventid: str
|
||||||
name: str = None
|
name: str = None
|
||||||
content: str = None
|
content: str = None
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
<template>
|
|
||||||
<q-input
|
|
||||||
v-model="versionInfo.name"
|
|
||||||
filled
|
|
||||||
label="バージョン名"
|
|
||||||
:rules="[(val) => val.length <= 20 || '20字以内で入力ください']"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="versionInfo.desc"
|
|
||||||
filled
|
|
||||||
type="textarea"
|
|
||||||
:rules="[(val) => val.length <= 80 || '80字以内で入力ください']"
|
|
||||||
label="説明"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref, watch, defineProps, defineEmits } from 'vue';
|
|
||||||
import { QInput } from 'quasar';
|
|
||||||
import { IVersionInfo } from 'src/types/AppTypes';
|
|
||||||
|
|
||||||
const props = defineProps<{
|
|
||||||
modelValue: IVersionInfo;
|
|
||||||
}>();
|
|
||||||
|
|
||||||
const versionInfo = ref({
|
|
||||||
...props.modelValue,
|
|
||||||
name: props.modelValue.name || `新バージョン ${new Date().toLocaleString()}`,
|
|
||||||
});
|
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue']);
|
|
||||||
|
|
||||||
watch(
|
|
||||||
versionInfo,
|
|
||||||
() => {
|
|
||||||
emit('update:modelValue', { ...versionInfo.value });
|
|
||||||
},
|
|
||||||
{ immediate: true, deep: true }
|
|
||||||
);
|
|
||||||
</script>
|
|
||||||
@@ -83,7 +83,7 @@ const getApps = async () => {
|
|||||||
id: item.appid,
|
id: item.appid,
|
||||||
name: item.appname,
|
name: item.appname,
|
||||||
url: `${item.domainurl}/k/${item.appid}`,
|
url: `${item.domainurl}/k/${item.appid}`,
|
||||||
user: `${item.user.first_name} ${item.user.last_name}` ,
|
user: `${item.updateuser.first_name} ${item.updateuser.last_name}` ,
|
||||||
updatetime:date.formatDate(item.update_time, 'YYYY/MM/DD HH:mm'),
|
updatetime:date.formatDate(item.update_time, 'YYYY/MM/DD HH:mm'),
|
||||||
version: Number(item.version)
|
version: Number(item.version)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,15 +14,6 @@
|
|||||||
<q-space></q-space>
|
<q-space></q-space>
|
||||||
<q-btn-dropdown color="primary" label="保存" icon="save" :loading="saveLoading" >
|
<q-btn-dropdown color="primary" label="保存" icon="save" :loading="saveLoading" >
|
||||||
<q-list>
|
<q-list>
|
||||||
<q-item clickable v-close-popup @click="onSaveVersion">
|
|
||||||
<q-item-section avatar >
|
|
||||||
<q-icon name="history"></q-icon>
|
|
||||||
</q-item-section>
|
|
||||||
<q-item-section>
|
|
||||||
<q-item-label>新バージョン保存</q-item-label>
|
|
||||||
</q-item-section>
|
|
||||||
</q-item>
|
|
||||||
|
|
||||||
<q-item clickable v-close-popup @click="onSaveFlow">
|
<q-item clickable v-close-popup @click="onSaveFlow">
|
||||||
<q-item-section avatar >
|
<q-item-section avatar >
|
||||||
<q-icon name="save" color="primary"></q-icon>
|
<q-icon name="save" color="primary"></q-icon>
|
||||||
@@ -84,10 +75,6 @@
|
|||||||
</template>
|
</template>
|
||||||
<action-select ref="appDg" name="model" :filter="filter" type="single" @clearFilter="onClearFilter" ></action-select>
|
<action-select ref="appDg" name="model" :filter="filter" type="single" @clearFilter="onClearFilter" ></action-select>
|
||||||
</ShowDialog>
|
</ShowDialog>
|
||||||
<!-- save version dialog -->
|
|
||||||
<ShowDialog v-model:visible="saveVersionAction" name="新バージョン保存" @close="closeSaveVersionDg" min-width="500px">
|
|
||||||
<version-input v-model="versionInfo" />
|
|
||||||
</ShowDialog>
|
|
||||||
<q-inner-loading
|
<q-inner-loading
|
||||||
:showing="initLoading"
|
:showing="initLoading"
|
||||||
color="primary"
|
color="primary"
|
||||||
@@ -100,7 +87,7 @@
|
|||||||
import { ref, reactive, computed, onMounted } from 'vue';
|
import { ref, reactive, computed, onMounted } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { IActionNode, ActionNode, IActionFlow, ActionFlow, RootAction, IActionProperty } from 'src/types/ActionTypes';
|
import { IActionNode, ActionNode, IActionFlow, ActionFlow, RootAction, IActionProperty } from 'src/types/ActionTypes';
|
||||||
import { IManagedApp, IVersionInfo } from 'src/types/AppTypes';
|
import { IManagedApp } from 'src/types/AppTypes';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useFlowEditorStore } from 'stores/flowEditor';
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
import { useAuthStore } from 'stores/useAuthStore';
|
import { useAuthStore } from 'stores/useAuthStore';
|
||||||
@@ -111,7 +98,6 @@ import ShowDialog from 'components/ShowDialog.vue';
|
|||||||
import ActionSelect from 'components/ActionSelect.vue';
|
import ActionSelect from 'components/ActionSelect.vue';
|
||||||
import PropertyPanel from 'components/right/PropertyPanel.vue';
|
import PropertyPanel from 'components/right/PropertyPanel.vue';
|
||||||
import EventTree from 'components/left/EventTree.vue';
|
import EventTree from 'components/left/EventTree.vue';
|
||||||
import VersionInput from 'components/dialog/VersionInput.vue';
|
|
||||||
import { FlowCtrl } from '../control/flowctrl';
|
import { FlowCtrl } from '../control/flowctrl';
|
||||||
import { useQuasar } from 'quasar';
|
import { useQuasar } from 'quasar';
|
||||||
|
|
||||||
@@ -119,7 +105,6 @@ const deployLoading = ref(false);
|
|||||||
const saveLoading = ref(false);
|
const saveLoading = ref(false);
|
||||||
const initLoading = ref(true);
|
const initLoading = ref(true);
|
||||||
const drawerLeft = ref(false);
|
const drawerLeft = ref(false);
|
||||||
const versionInfo = ref<IVersionInfo>();
|
|
||||||
const $q = useQuasar();
|
const $q = useQuasar();
|
||||||
const store = useFlowEditorStore();
|
const store = useFlowEditorStore();
|
||||||
const authStore = useAuthStore();
|
const authStore = useAuthStore();
|
||||||
@@ -132,7 +117,6 @@ const prevNodeIfo = ref({
|
|||||||
});
|
});
|
||||||
// const refFlow = ref<ActionFlow|null>(null);
|
// const refFlow = ref<ActionFlow|null>(null);
|
||||||
const showAddAction = ref(false);
|
const showAddAction = ref(false);
|
||||||
const saveVersionAction = ref(false);
|
|
||||||
const drawerRight = ref(false);
|
const drawerRight = ref(false);
|
||||||
const filter=ref("");
|
const filter=ref("");
|
||||||
const model = ref("");
|
const model = ref("");
|
||||||
@@ -193,7 +177,7 @@ const onDeleteAllNextNodes = (node: IActionNode) => {
|
|||||||
}
|
}
|
||||||
const closeDg = (val: any) => {
|
const closeDg = (val: any) => {
|
||||||
console.log("Dialog closed->", val);
|
console.log("Dialog closed->", val);
|
||||||
if (val == 'OK' && appDg?.value?.selected?.length > 0) {
|
if (val == 'OK') {
|
||||||
const data = appDg.value.selected[0];
|
const data = appDg.value.selected[0];
|
||||||
const actionProps = JSON.parse(data.property);
|
const actionProps = JSON.parse(data.property);
|
||||||
const outputPoint = JSON.parse(data.outputPoints);
|
const outputPoint = JSON.parse(data.outputPoints);
|
||||||
@@ -261,20 +245,6 @@ const onSaveActionProps=(props:IActionProperty[])=>{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSaveVersion = async () => {
|
|
||||||
versionInfo.value = {
|
|
||||||
id: '1' // TODO
|
|
||||||
}
|
|
||||||
saveVersionAction.value = true;
|
|
||||||
// await onSaveAllFlow();
|
|
||||||
}
|
|
||||||
|
|
||||||
const closeSaveVersionDg = (val: 'OK'|'CANCEL') => {
|
|
||||||
if (val == 'OK') {
|
|
||||||
console.log(versionInfo.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const onSaveFlow = async () => {
|
const onSaveFlow = async () => {
|
||||||
const targetFlow = store.selectedFlow;
|
const targetFlow = store.selectedFlow;
|
||||||
if (targetFlow === undefined) {
|
if (targetFlow === undefined) {
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ export const useFlowEditorStore = defineStore('flowEditor', {
|
|||||||
const jsonData = {
|
const jsonData = {
|
||||||
flowid: isNew ? flow.createNewId() : flow.id,
|
flowid: isNew ? flow.createNewId() : flow.id,
|
||||||
appid: this.appInfo?.appId,
|
appid: this.appInfo?.appId,
|
||||||
|
appname: this.appInfo?.name,
|
||||||
eventid: root?.name,
|
eventid: root?.name,
|
||||||
name: root?.subTitle,
|
name: root?.subTitle,
|
||||||
content: JSON.stringify(flow),
|
content: JSON.stringify(flow),
|
||||||
|
|||||||
@@ -9,12 +9,6 @@ export interface IManagedApp {
|
|||||||
appname: string;
|
appname: string;
|
||||||
domainurl: string;
|
domainurl: string;
|
||||||
version: string;
|
version: string;
|
||||||
user: IUser;
|
updateuser: IUser;
|
||||||
update_time: string;
|
update_time: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IVersionInfo {
|
|
||||||
id: string;
|
|
||||||
name?: string;
|
|
||||||
desc?: string;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user