def generate_signup_matches(): ''' TODO: 나중에 악용하는 넘 있으면 한 번만 호출 가능하도록 바꾸자 ^^ 2020-09-05 ''' gen_login_matches(g.user_session.user, Session(), 'gen_sy_query', Match.TYPE_SOYEON) gen_login_matches(g.user_session.user, Session(), 'gen_preference_query', Match.TYPE_PREFER) return {'okay': True}, Status.HTTP_200_OK
def get_type_group(type_group_id): try: type_group = Session().query(TypeGroup).filter( (TypeGroup.id == type_group_id)).one() except NoResultFound: raise ClientError(f'No Type group Found id #{type_group_id}', status_code=Status.HTTP_404_NOT_FOUND) return {'type_group': type_group.json()}, Status.HTTP_200_OK
def get_picture_by_id(picture_id): try: picture = Session().query(Picture).filter_by(id=picture_id).one() except: raise ClientError(f'picture id #{picture_id} not found', Status.HTTP_404_NOT_FOUND) if picture.user_id != g.user_session.user.id: raise ClientError('not your picture') return picture.json(), Status.HTTP_200_OK
def confirm_registration(user_id): try: user = Session().query(User).filter((User.id == user_id)).one() except NoResultFound: raise ClientError(f'user #{user_id} not found', Status.HTTP_404_NOT_FOUND) user.registration_confirmed = True user.registration_confirmed_at = datetime.now() Session().commit() return {'okay': True}, Status.HTTP_200_OK
def redeem(code): try: coupon = Session().query(Coupon).filter((Coupon.code == code)).one() except NoResultFound: raise ClientError('not found', Status.HTTP_404_NOT_FOUND) if coupon.user_id is not None: if coupon.user_id != g.user_session.user.id: raise ClientError('not yours', Status.HTTP_470_NOT_YOURS) coupon.redeem(g.user_session.user.id) Session().commit() return {'okay': True, 'hp': coupon.hp, 'mp': coupon.mp}, Status.HTTP_200_OK
def delete_picture_by_id(picture_id): try: picture = Session().query(Picture).filter_by(id=picture_id).one() except: raise ClientError(f'picture id #{picture_id} not found', Status.HTTP_404_NOT_FOUND) if picture.user_id != g.user_session.user.id: raise ClientError('not your picture') Session().delete(picture) Session().commit() return {'okay': True}, Status.HTTP_200_OK
def open_match(): try: match = Session().query(Match).filter( (Match.to_user_id == g.user_session.user.id) & (Match.id == request.json.get('match_id'))).one() except: raise ClientError('match not found or not your match', status_code=Status.HTTP_404_NOT_FOUND) match.opened = True Session().commit() return {'okay': True}, Status.HTTP_200_OK
def manner_point(cls, user_id, mp): ''' mp 는 음수일 수 있습니다. 음수라면 mp 가 감소합니다. ''' from libs.database.engine import Session, afr tx = afr(UserPointTx(user_id=user_id, mp=mp)) point = Session().query(UserPoint).filter( (UserPoint.user_id == user_id)).with_for_update().one() point.mp += mp Session().flush() return point
def heart_point(cls, user_id, hp): ''' hp 는 음수일 수 있습니다. 음수라면 hp 가 감소합니다. ''' from libs.database.engine import Session, afr tx = afr(UserPointTx(user_id=user_id, hp=hp)) point = Session().query(UserPoint).filter( (UserPoint.user_id == user_id)).with_for_update().one() point.hp += hp Session().flush() return point
def get_or_create_admin_session(admin): user_session = Session().query(UserSession).filter( (UserSession.admin == True) & (UserSession.expiry >= datetime.now()) & (UserSession.user_id == admin.user_id)).first() if user_session is None: user_session = UserSession(admin.user, admin=True) Session().add(user_session) Session().flush() return user_session
def on_create(self): question = question_helper.must_one(Session().query(Question).filter( (Question.id == request.json.get('question_id')))) answer = answer_helper.must_one(Session().query(Answer).filter( (Answer.id == request.json.get('answer_id')))) if answer.question_id != question.id: raise ClientError('Irrelevant q & a') self.result['question'] = question self.result['answer'] = answer
def generate_random_matches(): user = Session().query(User).filter( (User.sex != g.user_session.user.sex) & (User.id.notin_( Match.matched_user_ids(g.user_session.user.id, Session()))) ).order_by(func.random()).limit(1).one() match = afr( Match(from_user_id=user.id, to_user_id=g.user_session.user.id, type_=Match.TYPE_RANDOM)) Session().commit() return {'match': match.json()}, Status.HTTP_200_OK
def get_match_by_id(match_id): ''' id 로 매치를 가져옵니다. ''' try: match = Session().query(Match).filter((Match.id == match_id)).one() except: raise ClientError(f'No Match Found ${match_id}', Status.HTTP_404_NOT_FOUND) if match.to_user_id != g.user_session.user.id: raise ClientError('Not Your Match', Status.HTTP_470_NOT_YOURS) return {'match': match.json()}, Status.HTTP_200_OK
def stay(): ''' 회원탈퇴 하시려구요? 가지마세요 100 포인트 드립니다. ''' stay = Session().query(Stay).filter( (Stay.user_id == g.user_session.user.id)).one_or_none() if stay: raise ClientError('duplicate') stay = Stay(user_id=g.user_session.user.id) UserPoint.heart_point(g.user_session.user.id, 100) Session().add(stay) Session().commit() return {'okay': True}, Status.HTTP_200_OK
def get_unanswered_questions(): ''' 대답 안한 질문 목록을 리턴합니다. ''' user_answer = Session().query(UserAnswer).filter( (UserAnswer.user_id == g.user_session.user.id)).all() return { 'questions': [ q.json() for q in Session().query(Question).filter(( Question.id.notin_([ua.question_id for ua in user_answer]) )).order_by(Question.category_id).all() ] }, Status.HTTP_200_OK
def send_double_heart(): ''' 더블하트를 보냅니다. ''' heart = afr( Heart(from_user_id=g.user_session.user.id, to_user_id=request.json.get('user_id'), message=request.json.get('message'), double=True)) g.pr_result['to_match'].heart_id = heart.id g.pr_result['from_match'].heart_id = heart.id Session().add(heart) Session().commit() return {'okay': True, 'heart_id': heart.id}, Status.HTTP_200_OK
def settle_contract(): ''' 약관'들'에 동의합니다. ''' term_ids = request.json.get('term_ids') terms = Session().query(Term).filter((Term.id.in_(term_ids))).all() if len(terms) == 0: raise ClientError(f'No Term found #: {term_ids}', Status.HTTP_404_NOT_FOUND) for term in terms: Session(changed=True).add( TermsAgreement(term_id=term.id, user_id=g.user_session.user.id)) Session().commit() return {'okay': True}, Status.HTTP_200_OK
def on_login(self): user = self.helper.must_one(Session().query(User).filter((User.phone == request.json.get('phone')))) if user.password != User.gen_password_hash(request.json.get('password')): raise ClientError('invalid password', Status.HTTP_401_UNAUTHORIZED) self.result['user'] = user
def get_mbti_questions(): ''' mbti 문제들을 가져옵니다.: ''' return { 'questions': [x.json() for x in Session().query(MbtiQuestion).all()] }, Status.HTTP_200_OK
def login(): ''' 새로운 토큰을 발급해 줍니다. ''' user_session = afr(UserSession(g.pr_result.get('user'))) Session().commit() return {'token': user_session.token, 'expiry': DateTimeHelper.full_datetime(user_session.expiry)}, Status.HTTP_200_OK
def animal(self): if not hasattr(self, '_animal'): from libs.database.engine import Session from api.models.animal import Animal self._animal = Session().query(Animal).filter( (Animal.mbti == self.result_mbti)).one() return self._animal
def validate_sms_auth(cls, key, value, dry=False): from libs.database.engine import Session try: sms_auth = Session().query(SmsAuth).filter( (SmsAuth.auth_key == key) & (SmsAuth.auth_value == value) & (SmsAuth.expiration >= datetime.now())).one() except NoResultFound: return False else: if dry: return True Session().delete(sms_auth) Session().flush() return True
def get_life_style_answers(): answer = Session().query(LifeStyleAnswer).filter( (LifeStyleAnswer.user_id == g.user_session.user.id)).first() if answer is None: raise ClientError('answer not found', status_code=Status.HTTP_404_NOT_FOUND) return {'answers': answer.answers}, Status.HTTP_200_OK
def get_session(cls, token): from libs.database.engine import Session try: return Session().query(UserSession).filter((UserSession.token == token)).one() except NoResultFound: return None
def login_google(): oauth = Session().query(OauthGoogle).filter(OauthGoogle.party_id == g.info.get('id')).first() is_new = True if oauth is None else False if is_new: # TODO 여기서 블랙리스트 조회에서 에러 리턴. user = afr(User(email=g.info.get('email'))) oauth = afr(OauthGoogle(user, g.info)) user.oauth_google_id = oauth.id user_session = UserSession(oauth.user, third_party_token=request.json.get('token')) Session(changed=True).add(user_session) return {'okay':True, 'user_id':oauth.user.id, 'token': user_session.token, 'is_new': is_new, 'expiry': DateTimeHelper.full_datetime(user_session.expiry)}, Status.HTTP_200_OK
def login(): try: admin = Session().query(Admin).filter( (Admin.name == request.json.get('username')) & (Admin.password == hashlib.sha256( request.json.get('password').encode('utf-8')).hexdigest()) ).one() except NoResultFound: return { 'msg': 'wrong account or password', 'okay': False }, Status.HTTP_401_UNAUTHORIZED admin_session = get_or_create_admin_session(admin) Session().commit() return {'token': admin_session.token, 'okay': True}, Status.HTTP_200_OK
def accept_heart(): ''' 받은 하트를 승인합니다. ''' g.pr_result.get('heart').accept() Session().commit() return {'okay': True}, Status.HTTP_200_OK
def get_answered_questions(): ''' 대답 했던 질문 목록 리턴 UserAnswer 를 쿼리하되, Question ''' return {'questions': [ua.question.json() for ua in Session().query(UserAnswer) .filter((UserAnswer.user_id == g.user_session.user.id))\ .join(Question).order_by(Question.category_id).all()]}, Status.HTTP_200_OK
def register_match_question(): ''' question_ids 를 받아서 set question_ids 의 길이가 5를 초과하면 raise ClientError 하나라도 답변 안 한 질문이 있다면 raise ClientError ''' Session().query(MatchQuestion).filter( (MatchQuestion.user_id == g.user_session.user.id)).delete() Session().flush() match_questions = [ MatchQuestion(user_id=g.user_session.user.id, question_id=a.question_id) for a in g.pr_result.get('answers') ] afr(*match_questions) Session().commit() return {'okay': True}, Status.HTTP_200_OK
def get_random_matches(): matches = Session().query(Match).filter( (Match.to_user_id == g.user_session.user.id) & (Match.type_ == Match.TYPE_RANDOM) & (Match.matched == False) & (Match.created_at >= (datetime.now() - timedelta(days=2)).date())).all() return {'matches': [x.json() for x in matches]}, Status.HTTP_200_OK