routes.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from flask import request, jsonify, current_app
  2. from flask_login import login_required, current_user
  3. from app import db
  4. from app.models import Restaurant, RestaurantImage
  5. from app.utils import upload_file_to_gcs
  6. from . import main
  7. @main.route('/', methods=['GET'])
  8. def index():
  9. return jsonify({'status': 'OK'})
  10. @main.route('/restaurants', methods=['GET'])
  11. def get_restaurants():
  12. # Basic search implementation
  13. # In real app, use PostGIS or similar for geo-search
  14. lat = request.args.get('lat', type=float)
  15. lng = request.args.get('lng', type=float)
  16. query = Restaurant.query.filter_by(status='approved')
  17. # Very basic "nearby" filter (bounding box would be better)
  18. if lat and lng:
  19. # This is not accurate but a placeholder
  20. query = query.filter(Restaurant.latitude.between(lat-0.1, lat+0.1))
  21. query = query.filter(Restaurant.longitude.between(lng-0.1, lng+0.1))
  22. restaurants = query.all()
  23. results = []
  24. for r in restaurants:
  25. results.append({
  26. 'id': r.id,
  27. 'name': r.name,
  28. 'address': r.address,
  29. 'min_price': r.min_price,
  30. 'max_price': r.max_price,
  31. 'images': [i.image_url for i in r.images],
  32. 'user_rating': r.user_rating
  33. })
  34. return jsonify(results)
  35. @main.route('/restaurants', methods=['POST'])
  36. @login_required
  37. def create_restaurant():
  38. # Handle multipart/form-data for images
  39. data = request.form
  40. # Check probation
  41. if current_user.is_probation:
  42. status = 'pending'
  43. else:
  44. status = 'approved'
  45. restaurant = Restaurant(
  46. name=data['name'],
  47. address=data['address'],
  48. latitude=data.get('latitude'),
  49. longitude=data.get('longitude'),
  50. google_place_id=data.get('google_place_id'),
  51. min_price=data.get('min_price'),
  52. max_price=data.get('max_price'),
  53. single_price=data.get('single_price') == 'true',
  54. drink_included=data.get('drink_included') == 'true',
  55. options_count=data.get('options_count'),
  56. user_rating=data.get('user_rating'),
  57. user_description=data.get('user_description'),
  58. status=status,
  59. user_id=current_user.id
  60. )
  61. db.session.add(restaurant)
  62. db.session.commit()
  63. # Handle images
  64. images = request.files.getlist('images')
  65. bucket_name = current_app.config.get('GCS_BUCKET_NAME')
  66. for img in images[:5]: # Limit to 5
  67. if img and bucket_name:
  68. try:
  69. url = upload_file_to_gcs(img, bucket_name)
  70. img_obj = RestaurantImage(image_url=url, restaurant_id=restaurant.id)
  71. db.session.add(img_obj)
  72. except Exception as e:
  73. print(f"Error uploading image: {e}")
  74. db.session.commit()
  75. return jsonify({'message': 'Restaurant created', 'id': restaurant.id, 'status': status}), 201
  76. @main.route('/restaurants/<int:id>', methods=['GET'])
  77. def get_restaurant(id):
  78. r = Restaurant.query.get_or_404(id)
  79. return jsonify({
  80. 'id': r.id,
  81. 'name': r.name,
  82. 'address': r.address,
  83. 'min_price': r.min_price,
  84. 'max_price': r.max_price,
  85. 'single_price': r.single_price,
  86. 'drink_included': r.drink_included,
  87. 'options_count': r.options_count,
  88. 'user_rating': r.user_rating,
  89. 'user_description': r.user_description,
  90. 'images': [i.image_url for i in r.images],
  91. 'author': r.author.username
  92. })