diff --git a/api/core.py b/api/core.py index 474f8de..3ad3c4b 100644 --- a/api/core.py +++ b/api/core.py @@ -25,8 +25,22 @@ def create_app(config_name="config"): response.status_code = 400 return response + @app.errorhandler(ValueError) + def on_validation_error(error): + response = jsonify({"status": 400, "message": str(error)}) + response.status_code = 400 + return response + # register resources - from api.resources import server, designers, categories, prices, orders, order_rows + from api.resources import ( + server, + designers, + categories, + prices, + orders, + order_rows, + markets, + ) app.register_blueprint(server.mod) app.register_blueprint(designers.mod) @@ -34,5 +48,6 @@ def create_app(config_name="config"): app.register_blueprint(prices.mod) app.register_blueprint(orders.mod) app.register_blueprint(order_rows.mod) + app.register_blueprint(markets.mod) return app diff --git a/api/models/market.py b/api/models/market.py index cc2e251..2cd6fc6 100644 --- a/api/models/market.py +++ b/api/models/market.py @@ -2,6 +2,7 @@ from api.extensions import db from .product import Currencies +from sqlalchemy.orm import validates class Market(db.Model): @@ -10,6 +11,16 @@ class Market(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255)) + @validates("name") + def validate_name(self, key, value): + raise ValueError("Name can not be modified") + + def to_json(self): + return { + "id": self.id, + "name": self.name, + } + class PriceAdjustments(db.Model): diff --git a/api/resources/markets.py b/api/resources/markets.py new file mode 100644 index 0000000..ef0060b --- /dev/null +++ b/api/resources/markets.py @@ -0,0 +1,39 @@ +from flask import Blueprint, request, jsonify +from api import db +from api.models import Market +from api.helpers import pagination_to_dict, check_api_key + +mod = Blueprint("markets", __name__, url_prefix="/markets") + +mod.before_request(check_api_key) + + +@mod.route("/", methods=["GET"]) +def list(): + page = request.args.get("page", 1, type=int) + per_page = request.args.get("per_page", 20, type=int) + query = Market.query.order_by(Market.id.asc()) + pagination = query.paginate(page=page, per_page=per_page) + j = { + "pagination": pagination_to_dict(pagination), + "data": [item.to_json() for item in pagination.items], + } + return jsonify(j) + + +@mod.route("/", methods=["GET"]) +def show(id): + market = Market.query.get_or_404(id) + return jsonify(market.to_json()) + + +@mod.route("/", methods=["PUT"]) +def update(id): + market = Market.query.get_or_404(id) + data = request.json + for k, v in data.items(): + setattr(market, k, v) + db.session.add(market) + db.session.commit() + + return jsonify(market.to_json()) diff --git a/docs/README.md b/docs/README.md index 06b6a98..894bc7b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,7 @@ Welcome to the documentation for Photowall API 2. * [Designers](designers.md) * [Prices](prices.md) * [Orders](orders.md) +* [Markets](markets.md) ## Authentication diff --git a/docs/markets.md b/docs/markets.md new file mode 100644 index 0000000..4a381fc --- /dev/null +++ b/docs/markets.md @@ -0,0 +1,19 @@ +# Markets + +## List markets + +``` +curl -X GET https://api.photowall.com/markets/ +``` + +## Show market + +``` +curl -X GET https://api.photowall.com/markets/1 +``` + +## Update market + +``` +curl -X PUT https://api:5000/markets/1 -H "Content-Type: application/json" -d '{"price_adjustment": "1.25"} +```