import json import logging from odoo import http from odoo.http import request from .base import EncoachMixin _logger = logging.getLogger(__name__) class EntitiesController(EncoachMixin, http.Controller): @http.route('/api/entities', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*') def list_entities(self, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) offset, limit, page = self._paginate_params(kwargs) entities = request.env['encoach.entity'].sudo().search([], limit=limit, offset=offset, order='name asc') total = request.env['encoach.entity'].sudo().search_count([]) return self._json_response({ 'items': [e.to_encoach_dict() for e in entities], 'total': total, 'page': page, 'limit': limit, }) except Exception: _logger.exception("List entities error") return self._error_response('Internal server error', 500) @http.route('/api/entities', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*') def create_entity(self, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) body = self._get_json_body() name = body.get('name', '').strip() if not name: return self._error_response('name is required', 400) entity = request.env['encoach.entity'].sudo().create({ 'name': name, 'label': body.get('label', name), 'licenses': body.get('licenses', 0), 'expiry_date': body.get('expiryDate'), 'payment_currency': body.get('paymentCurrency'), 'payment_price': body.get('paymentPrice', 0), }) return self._json_response(entity.to_encoach_dict()) except Exception: _logger.exception("Create entity error") return self._error_response('Internal server error', 500) @http.route('/api/entities/', type='http', auth='public', methods=['PATCH', 'OPTIONS'], csrf=False, cors='*') def update_entity(self, entity_id, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) entity = request.env['encoach.entity'].sudo().browse(entity_id) if not entity.exists(): return self._error_response('Entity not found', 404) body = self._get_json_body() vals = {} if 'name' in body: vals['name'] = body['name'] if 'label' in body: vals['label'] = body['label'] if 'licenses' in body: vals['licenses'] = body['licenses'] if 'expiryDate' in body: vals['expiry_date'] = body['expiryDate'] if 'paymentCurrency' in body: vals['payment_currency'] = body['paymentCurrency'] if 'paymentPrice' in body: vals['payment_price'] = body['paymentPrice'] if vals: entity.write(vals) return self._json_response(entity.to_encoach_dict()) except Exception: _logger.exception("Update entity error") return self._error_response('Internal server error', 500) @http.route('/api/entities/', type='http', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False, cors='*') def delete_entity(self, entity_id, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) entity = request.env['encoach.entity'].sudo().browse(entity_id) if not entity.exists(): return self._error_response('Entity not found', 404) entity.unlink() return self._json_response({'ok': True}) except Exception: _logger.exception("Delete entity error") return self._error_response('Internal server error', 500) @http.route('/api/roles', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*') def list_roles(self, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) domain = [] entity_id = kwargs.get('entityID') if entity_id: domain.append(('entity_id', '=', int(entity_id))) roles = request.env['encoach.role'].sudo().search(domain) return self._json_response([{ 'id': r.id, 'name': r.name, 'entityId': r.entity_id.id if r.entity_id else None, } for r in roles]) except Exception: _logger.exception("List roles error") return self._error_response('Internal server error', 500) @http.route('/api/roles', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*') def create_role(self, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) body = self._get_json_body() name = body.get('name', '').strip() if not name: return self._error_response('name is required', 400) vals = {'name': name} if body.get('entityId'): vals['entity_id'] = int(body['entityId']) role = request.env['encoach.role'].sudo().create(vals) return self._json_response({'id': role.id, 'name': role.name, 'entityId': role.entity_id.id if role.entity_id else None}) except Exception: _logger.exception("Create role error") return self._error_response('Internal server error', 500) @http.route('/api/roles/', type='http', auth='public', methods=['PATCH', 'OPTIONS'], csrf=False, cors='*') def update_role(self, role_id, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) role = request.env['encoach.role'].sudo().browse(role_id) if not role.exists(): return self._error_response('Role not found', 404) body = self._get_json_body() vals = {} if 'name' in body: vals['name'] = body['name'] if vals: role.write(vals) return self._json_response({'id': role.id, 'name': role.name, 'entityId': role.entity_id.id if role.entity_id else None}) except Exception: _logger.exception("Update role error") return self._error_response('Internal server error', 500) @http.route('/api/roles/', type='http', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False, cors='*') def delete_role(self, role_id, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) role = request.env['encoach.role'].sudo().browse(role_id) if not role.exists(): return self._error_response('Role not found', 404) role.unlink() return self._json_response({'ok': True}) except Exception: _logger.exception("Delete role error") return self._error_response('Internal server error', 500) @http.route('/api/permissions', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*') def list_permissions(self, **kwargs): try: user = self._authenticate() if not user: return self._error_response('Unauthorized', 401) perms = request.env['encoach.permission'].sudo().search([]) return self._json_response([{'id': p.id, 'topic': p.topic, 'type': p.perm_type} for p in perms]) except Exception: _logger.exception("List permissions error") return self._error_response('Internal server error', 500)