107 lines
4.2 KiB
Python
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)
|