discentes-imd / IntegraTI-API

API RESTful para o projeto IntegraTI
https://api-integrati.herokuapp.com/
GNU General Public License v3.0
6 stars 0 forks source link

Mover inserted_by e updated_by para o modelo Base #34

Open felihenrique opened 7 years ago

felihenrique commented 7 years ago

Essa é uma tarefa repetitiva e igual para todas as ocasiões (corrijam se eu estiver errado), então creio que seria melhor deixar no modelo Base.

rodrigondec commented 7 years ago

Mas já está assim

class Base(db.Model):
    __abstract__ = True

    disabled = db.Column(db.Boolean, default=0)
    inserted_since = db.Column(db.DateTime, default=db.func.now())
    @declared_attr
    def inserted_by(cls):
        return db.Column(db.Integer, db.ForeignKey('user.id_user'))
    # inserted_by = db.Column(db.Integer, db.ForeignKey('user.id_user'))
    last_updated_since = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
    @declared_attr
    def last_updated_by(cls):
        return db.Column(db.Integer, db.ForeignKey('user.id_user'))
    # last_updated_by = db.Column(db.Integer, db.ForeignKey('user.id_user'))

class User(Base):
    id_user = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    email = db.Column(db.String(50), unique=True)
    sigaa_registration_number = db.Column(db.String(15), unique=True)
    sigaa_user_name = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(64))
    id_photo_file = db.Column(db.Integer, db.ForeignKey('file.id_file'))
    event_participations = db.relationship(
        'Event',
        secondary=event_participation,
        backref=db.backref('participating_users', lazy='dynamic')
    )
    user_interests = db.relationship(
        'Tag',
        secondary=user_interest,
        backref=db.backref('interested_users', lazy='dynamic')
    )
felihenrique commented 7 years ago

Mas pq então os modelos recebem esses parâmetros?

felihenrique commented 7 years ago

Acho que me expressei errado, o que quis dizer é o preenchimento desses dados ficar no modelo base, pegando os dados de sessão e preenchendo.

rodrigondec commented 7 years ago

Os modelos recebem esse parâmetro porque eles herdam da classe Base, e a classe Base é abstract. Então o que tem nela vira só um copy-paste pros outros models.

E o ideal é esse id_user ser pego a partir da sessão mesmo. E só precisaremos nos preocupar com o id_user mesmo.

Levando em consideração que os campos de data serão pegos a partir do tempo do banco de dados que for feita uma alteração, de acordo com o código:

inserted_since = db.Column(db.DateTime, default=db.func.now())
last_updated_since = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())

Creio que esse onupdate=db.func.now() crie um trigger no banco ou algo assim.

felihenrique commented 7 years ago

Mas então porque colocar nos parametros nas classes derivadas?

rodrigondec commented 7 years ago

Mas ele não 'está' nas classes derivadas. As classes derivadas herdam esses parâmetros.

Não pode existir a persisência da classe Base no sistema. Então as classes derivadas herdam os atributos da classe Base.

felihenrique commented 7 years ago

Mas poderia fazer algo parecido com o que fez com a data:

updated_by = db.Column(db.Integer, db.ForeignKey('user.id_user'), default=getUserID(), onupdate=getUserID())

rodrigondec commented 7 years ago

Existe isso?

Não sabia, se tiver mesmo a gente utiliza.

felihenrique commented 7 years ago

getUserID é uma função ficticia kkk seria o método que usariamos para pegar o id atual do usuário na sessão.

rodrigondec commented 7 years ago

Saquei, o negócio é que não teremos sessão. O que teremos é token de permissão pra ter uma sessão no IntegraTI-Web. A gente sempre vai receber o id do usuário junto do json de informações da ação atual

felihenrique commented 7 years ago

Mas o token funciona como se fosse a sessão, ele contém os dados de sessão do usuário, só que encriptados. Dá uma olhada nessa library para python: http://pyjwt.readthedocs.io/en/latest/ E esse método ai funciona, pelo que testei aqui. Vou subir no branch evento_controllers para vc dar uma olhada.

rodrigondec commented 7 years ago

Na reunião que ocorreu com Itamir, discutimos um pouco sobre isso e pensamos em utilizar Oauth É a mesma coisa do que esse dai ou se complementam? depois de uma olhada

felihenrique commented 7 years ago

Oauth é mais complexo, e creio que não vale a pena para esse projeto já que muitas das features dele (como por ex. disponibilização de autenticação para terceiros) a gente não vai utilizar. Esse dai é bem mais simples.

felihenrique commented 7 years ago

Dê uma olhada no link que te mandei.