Files
Talal Sharabi bf3981028b Fix model-controller mismatches and routing issues
- ticket: add user_id, priority, category fields; fix _serialize_ticket -> _serialize
- package: fix is_active -> active (Odoo auto-filter), remove invalid entity_id filter
- walkthrough: add sequence field; fix controller to use name/content instead of title/steps
- users: fix encoach_user_type -> encoach_type, encoach_entity_id -> entity_rel_ids.entity_id
- generation: use EncoachGenerationService class instead of nonexistent ORM model,
  fix /api/exam/level/ route conflict (separate GET and POST URLs)

Made-with: Cursor
2026-03-15 01:08:36 +04:00

190 lines
7.9 KiB
Python

import json
import logging
from odoo import http
from odoo.http import request
from .base import EncoachMixin
_logger = logging.getLogger(__name__)
class SubscriptionsController(EncoachMixin, http.Controller):
# ---------------------------------------------------------- packages
@http.route('/api/packages', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*')
def list_packages(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
domain = []
packages = request.env['encoach.package'].sudo().search(domain, order='price asc')
return self._json_response([p.to_encoach_dict() for p in packages])
except Exception:
_logger.exception("List packages error")
return self._error_response('Internal server error', 500)
# ---------------------------------------------------- stripe checkout
@http.route('/api/stripe', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
def create_stripe_checkout(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
body = self._get_json_body()
package_id = body.get('packageId')
if not package_id:
return self._error_response('packageId is required', 400)
package = request.env['encoach.package'].sudo().browse(int(package_id))
if not package.exists():
return self._error_response('Package not found', 404)
success_url = body.get('successUrl', '')
cancel_url = body.get('cancelUrl', '')
discount_code = body.get('discountCode')
from odoo.addons.encoach_subscription.services.stripe_service import EncoachStripeService
service = EncoachStripeService(request.env)
result = service.create_checkout_session(
user=user,
package=package,
success_url=success_url,
cancel_url=cancel_url,
discount_code=discount_code,
)
return self._json_response(result)
except Exception:
_logger.exception("Stripe checkout error")
return self._error_response('Internal server error', 500)
# ------------------------------------------------ paypal create order
@http.route('/api/paypal', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
def create_paypal_order(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
body = self._get_json_body()
package_id = body.get('packageId')
if not package_id:
return self._error_response('packageId is required', 400)
package = request.env['encoach.package'].sudo().browse(int(package_id))
if not package.exists():
return self._error_response('Package not found', 404)
discount_code = body.get('discountCode')
from odoo.addons.encoach_subscription.services.paypal_service import EncoachPaypalService
service = EncoachPaypalService(request.env)
result = service.create_order(
user=user,
package=package,
discount_code=discount_code,
)
return self._json_response(result)
except Exception:
_logger.exception("PayPal create order error")
return self._error_response('Internal server error', 500)
# ---------------------------------------------- paypal capture order
@http.route('/api/paypal/approve', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
def capture_paypal_order(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
body = self._get_json_body()
order_id = body.get('orderId')
if not order_id:
return self._error_response('orderId is required', 400)
from odoo.addons.encoach_subscription.services.paypal_service import EncoachPaypalService
service = EncoachPaypalService(request.env)
result = service.capture_order(
user=user,
order_id=order_id,
)
return self._json_response(result)
except Exception:
_logger.exception("PayPal capture error")
return self._error_response('Internal server error', 500)
# ------------------------------------------------ paymob intention
@http.route('/api/paymob', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
def create_paymob_intention(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
body = self._get_json_body()
package_id = body.get('packageId')
if not package_id:
return self._error_response('packageId is required', 400)
package = request.env['encoach.package'].sudo().browse(int(package_id))
if not package.exists():
return self._error_response('Package not found', 404)
discount_code = body.get('discountCode')
from odoo.addons.encoach_subscription.services.paymob_service import EncoachPaymobService
service = EncoachPaymobService(request.env)
result = service.create_intention(
user=user,
package=package,
discount_code=discount_code,
)
return self._json_response(result)
except Exception:
_logger.exception("Paymob intention error")
return self._error_response('Internal server error', 500)
# ------------------------------------------------ stripe webhook
@http.route('/api/stripe/webhook', type='http', auth='public', methods=['POST'], csrf=False, cors='*')
def stripe_webhook(self, **kwargs):
try:
payload = request.httprequest.get_data(as_text=True)
sig_header = request.httprequest.headers.get('Stripe-Signature', '')
from odoo.addons.encoach_subscription.services.stripe_service import EncoachStripeService
service = EncoachStripeService(request.env)
result = service.handle_webhook(payload, sig_header)
if 'error' in result:
return self._error_response(result['error'], 400)
return self._json_response(result)
except Exception:
_logger.exception("Stripe webhook error")
return self._error_response('Internal server error', 500)
# ------------------------------------------------ paymob webhook
@http.route('/api/paymob/webhook', type='http', auth='public', methods=['POST'], csrf=False, cors='*')
def paymob_webhook(self, **kwargs):
try:
payload = request.httprequest.get_data(as_text=True)
hmac_header = request.httprequest.args.get('hmac', '')
from odoo.addons.encoach_subscription.services.paymob_service import EncoachPaymobService
service = EncoachPaymobService(request.env)
result = service.verify_transaction(json.loads(payload), hmac_header)
if not result or 'error' in result:
return self._error_response(result.get('error', 'Verification failed') if result else 'Verification failed', 400)
return self._json_response(result)
except Exception:
_logger.exception("Paymob webhook error")
return self._error_response('Internal server error', 500)