sql_app: create and link iot device
Signed-off-by: HeshamTB <hishaminv@gmail.com>
This commit is contained in:
parent
a28183ddd8
commit
fe3a193a4f
@ -8,6 +8,8 @@ from . import models, schemas, crypto, auth_helper
|
||||
def get_user(db: Session, user_id: int):
|
||||
return db.query(models.User).filter(models.User.id == user_id).first()
|
||||
|
||||
def get_iot_entity(db: Session, id: int):
|
||||
return db.query(models.IotEntity).filter(models.IotEntity.id == id).first()
|
||||
|
||||
def get_user_by_email(db: Session, email: str):
|
||||
return db.query(models.User).filter(models.User.email == email).first()
|
||||
@ -15,16 +17,13 @@ def get_user_by_email(db: Session, email: str):
|
||||
def get_user_by_username(db: Session, username: str):
|
||||
return db.query(models.User).filter(models.User.username == username).first()
|
||||
|
||||
|
||||
def get_users(db: Session, skip: int = 0, limit: int = 100):
|
||||
return db.query(models.User).offset(skip).limit(limit).all()
|
||||
|
||||
|
||||
def create_user(db: Session, user: schemas.UserCreate):
|
||||
key = crypto.gen_new_key(user.password)
|
||||
salt = key[1]
|
||||
hashed_pass = key[0]
|
||||
# TODO: check if user already exists? based on name,email ...
|
||||
db_user = models.User(email=user.email, username=user.username,hashed_password=hashed_pass, passwd_salt=salt)
|
||||
db.add(db_user)
|
||||
db.commit()
|
||||
@ -36,9 +35,17 @@ def get_iot_entities(db: Session, skip: int = 0, limit: int = 100):
|
||||
return db.query(models.IotEntity).offset(skip).limit(limit).all()
|
||||
|
||||
|
||||
def create_iot_entity(db: Session, item: schemas.IotEntityCreate, user_id: int):
|
||||
db_item = models.Item(**item.dict(), owner_id=user_id)
|
||||
def create_iot_entity(db: Session, iot_entity: schemas.IotEntityCreate):
|
||||
db_item = models.IotEntity(id=iot_entity.id, description=iot_entity.description)
|
||||
db.add(db_item)
|
||||
db.commit()
|
||||
db.refresh(db_item)
|
||||
return db_item
|
||||
|
||||
def create_user_link_to_iot(db: Session, user_id: int, iot_dev_id: int):
|
||||
# Ensure link is not already present and it does not allow duplicates
|
||||
new_link = models.UserAuthToIoTDev(user_id=user_id, iot_entity_id=iot_dev_id)
|
||||
db.add(new_link)
|
||||
db.commit()
|
||||
db.refresh(new_link)
|
||||
return True
|
@ -74,6 +74,11 @@ def read_iot_entities(skip: int = 0, limit: int = 100, db: Session = Depends(get
|
||||
iot_entities = crud.get_iot_entities(db, skip=skip, limit=limit)
|
||||
return iot_entities
|
||||
|
||||
@app.post("/admin/iotentities/create", response_model=schemas.IotEntity, tags=['Admin'])
|
||||
def create_iot_entities(iot_entity: schemas.IotEntityCreate, db: Session = Depends(get_db)):
|
||||
iot_entities = crud.create_iot_entity(db, iot_entity)
|
||||
return iot_entities
|
||||
|
||||
@app.get("/admin/users/{user_id}", response_model=schemas.User, tags=['Admin'])
|
||||
def read_user(user_id: int, db: Session = Depends(get_db)):
|
||||
db_user = crud.get_user(db, user_id=user_id)
|
||||
@ -81,13 +86,27 @@ def read_user(user_id: int, db: Session = Depends(get_db)):
|
||||
raise HTTPException(status_code=404, detail="User not found")
|
||||
return db_user
|
||||
|
||||
@app.post("/admin/users/{user_id}/allow/{iot_entity_id}", tags=['Admin'])
|
||||
def allow_user_for_iot_entity(request: schemas.UserAllowForIotEntityRequest, db: Session = Depends(get_db)):
|
||||
user = crud.get_user(db, request.user_id)
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="User not found")
|
||||
|
||||
iot_entity = crud.get_iot_entity(db, request.iot_entity_id)
|
||||
if not iot_entity:
|
||||
raise HTTPException(status_code=404, detail="Iot Entity not found")
|
||||
|
||||
res = crud.create_user_link_to_iot(db, request.user_id, request.iot_entity_id)
|
||||
if not res:
|
||||
raise HTTPException(status_code=500, detail="Could not complete operation")
|
||||
|
||||
return
|
||||
|
||||
@app.get("/users/acesslist/", response_model=List[schemas.IotEntity], tags=['Users'])
|
||||
def get_iot_access_list_for_user(db: Session = Depends(get_db), current_user: schemas.User = Depends(get_current_active_user)):
|
||||
user = crud.get_user_by_username(db, current_user.username)
|
||||
return user.authorized_devices
|
||||
|
||||
|
||||
@app.post("/tkn", response_model=schemas.Token, tags=['Users'])
|
||||
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
|
||||
user = auth_helper.authenticate_user(db, form_data.username, form_data.password)
|
||||
|
@ -22,7 +22,6 @@ class IotEntity(Base):
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
description = Column(String, index=True)
|
||||
owner_id = Column(Integer, ForeignKey("user_accounts.id"))
|
||||
|
||||
authorized_users = relationship("User", secondary= 'user_iot_link')
|
||||
|
||||
|
@ -7,28 +7,25 @@ class IotEntityBase(BaseModel):
|
||||
id: int
|
||||
description: str
|
||||
|
||||
class UserBase(BaseModel):
|
||||
email: str
|
||||
username: str
|
||||
|
||||
class IotEntityCreate(IotEntityBase):
|
||||
pass
|
||||
|
||||
|
||||
class IotEntity(IotEntityBase):
|
||||
id: int
|
||||
description: str
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
|
||||
class UserBase(BaseModel):
|
||||
email: str
|
||||
username: str
|
||||
|
||||
|
||||
class UserCreate(UserBase):
|
||||
password: str
|
||||
|
||||
|
||||
class IotEntity(IotEntityBase):
|
||||
id: int
|
||||
description: str
|
||||
#authorized_users: List[User] = []
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
class User(UserBase):
|
||||
id: int
|
||||
is_active: bool
|
||||
@ -37,6 +34,7 @@ class User(UserBase):
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
|
||||
class Token(BaseModel):
|
||||
access_token : str
|
||||
token_type : str
|
||||
@ -45,3 +43,7 @@ class TokenData(BaseModel):
|
||||
username : str
|
||||
# Token can conatin information. But we are already recording this in a database
|
||||
# for scalability.
|
||||
|
||||
class UserAllowForIotEntityRequest(BaseModel):
|
||||
user_id: int
|
||||
iot_entity_id: int
|
Loading…
Reference in New Issue
Block a user