2026-10-01 11:16:50 +05:30

107 lines
4.2 KiB
Python

# -*- 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)