# -*- coding: utf-8 -*- import json import logging from odoo import http from odoo.http import request from odoo.exceptions import AccessError, AccessDenied _logger = logging.getLogger(__name__) def json_response(success, data=None, error_code=None, error_message=None, status=200): if success: body = { "success": True, "data": data or {} } else: body = { "success": False, "error": { "code": error_code or "ERROR", "message": error_message or "An error occurred" } } return request.make_response( json.dumps(body), headers=[('Content-Type', 'application/json')], status=status ) class MobileAuth(http.Controller): @http.route('/api/mobile/v1/auth/login', type='http', auth='none', methods=['POST'], csrf=False, cors='*') def login(self, **kwargs): try: data = json.loads(request.httprequest.data) email = data.get('email') password = data.get('password') if not email or not password: return json_response(False, error_code="INVALID_REQUEST", error_message="Email and password are required", status=400) db = request.db or request.env.registry.db_name # Authenticate creates a session securely credential = {'login': email, 'password': password, 'type': 'password'} auth_info = request.session.authenticate(request.env, credential) uid = auth_info.get('uid') if not uid: return json_response(False, error_code="AUTH_FAILED", error_message="Invalid email or password", status=401) request.update_env(user=uid) user = request.env['res.users'].sudo().browse(uid) student = user.student_id return json_response(True, data={ "user": { "id": user.id, "name": user.name, "email": user.login, "role": "student" if student else "user" }, "student": { "id": student.id, "name": student.full_name } if student else None }) except (AccessError, AccessDenied): return json_response(False, error_code="AUTH_FAILED", error_message="Invalid email or password", status=401) except Exception as e: _logger.exception("Login error") return json_response(False, error_code="SERVER_ERROR", error_message=str(e), status=500) @http.route('/api/mobile/v1/auth/logout', type='http', auth='public', methods=['POST'], csrf=False, cors='*') def logout(self, **kwargs): if request.env.user._is_public(): return json_response(False, error_code="AUTH_REQUIRED", error_message="Authentication required", status=401) try: request.session.logout(keep_db=True) return json_response(True, data={"message": "Logged out successfully"}) except Exception as e: return json_response(False, error_code="SERVER_ERROR", error_message=str(e), status=500) @http.route('/api/mobile/v1/auth/me', type='http', auth='public', methods=['GET'], cors='*') def get_me(self, **kwargs): if request.env.user._is_public(): return json_response(False, error_code="AUTH_REQUIRED", error_message="Authentication required", status=401) try: user = request.env.user student = user.student_id return json_response(True, data={ "user": { "id": user.id, "name": user.name, "email": user.login, "role": "student" if student else "user" }, "student": { "id": student.id, "name": student.full_name } if student else None }) except Exception as e: return json_response(False, error_code="SERVER_ERROR", error_message=str(e), status=500)