diff --git a/README.md b/README.md index 87c1760f..bea76b18 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # time-tracker-api +## Getting started +Follow the following instructions to get the project ready to use ASAP: + +### Requirements +Be sure you have installed in your system + +- [Python version 3](https://www.python.org/download/releases/3.0/) in your path. It will install +automatically [pip](https://pip.pypa.io/en/stable/) as well. +- A virtual environment, namely [venv](https://docs.python.org/3/library/venv.html). + ## Setup - Create and activate the environment, @@ -36,4 +46,5 @@ flask run ``` -- Open `http://127.0.0.1:5000/` in a browser \ No newline at end of file +- Open `http://127.0.0.1:5000/` in a browser. You will find in the presented UI +a link to the swagger.json with the definition of the api. \ No newline at end of file diff --git a/time_tracker_api/__init__.py b/time_tracker_api/__init__.py index 03db688f..61cec3f1 100644 --- a/time_tracker_api/__init__.py +++ b/time_tracker_api/__init__.py @@ -1,12 +1,14 @@ from flask import Flask -from flask_restplus import Api def create_app(): flask_app = Flask(__name__) - app = Api(app=flask_app) - from time_tracker_api.projects.projects_endpoints import ns as projects_ns - app.add_namespace(projects_ns) + init_app(flask_app) return flask_app + + +def init_app(app: Flask): + from .api import api + api.init_app(app) diff --git a/time_tracker_api/activities/activities_api.py b/time_tracker_api/activities/activities_api.py new file mode 100644 index 00000000..b9578842 --- /dev/null +++ b/time_tracker_api/activities/activities_api.py @@ -0,0 +1,57 @@ +from flask_restplus import fields, Resource, Namespace + +ns = Namespace('activities', description='API for activities') + +# Activity Model +activity = ns.model('Activity', { + 'id': fields.String(readOnly=True, required=True, title='Identifier', + description='The unique id of the activity'), + 'name': fields.String(required=True, title='Name', max_length=50, + description='Canonical name of the activity'), + 'description': fields.String(title='Description', + description='Comments about the activity'), + 'tenant_id': fields.String(required=True, title='Tenant', max_length=64, + description='The tenant this belongs to') +}) + + +@ns.route('/') +class Activities(Resource): + @ns.doc('list_activities') + @ns.marshal_list_with(activity, code=200) + def get(self): + """List all available activities""" + return [] + + @ns.doc('create_activity') + @ns.expect(activity) + @ns.marshal_with(activity, code=201) + @ns.response(400, 'Invalid format of the attributes of the activity.') + def post(self): + """Create a single activity""" + return ns.payload, 201 + + +@ns.route('/') +@ns.response(404, 'Activity not found') +@ns.param('id', 'The unique identifier of the activity') +class Activity(Resource): + @ns.doc('get_activity') + @ns.marshal_with(activity) + def get(self, id): + """Retrieve all the data of a single activity""" + return {} + + @ns.doc('delete_activity') + @ns.response(204, 'The activity was deleted successfully (No content is returned)') + def delete(self, id): + """Deletes a activity""" + return None, 204 + + @ns.doc('put_activity') + @ns.response(400, 'Invalid format of the attributes of the activity.') + @ns.expect(activity) + @ns.marshal_with(activity) + def put(self, id): + """Updates an activity""" + return ns.payload diff --git a/time_tracker_api/api.py b/time_tracker_api/api.py new file mode 100644 index 00000000..4f2742fa --- /dev/null +++ b/time_tracker_api/api.py @@ -0,0 +1,12 @@ + +from flask_restplus import Api + +api = Api(version='1.0.1', title="TimeTracker API", + description="API for the TimeTracker project") + +# APIs +from time_tracker_api.projects import projects_api +api.add_namespace(projects_api.ns) + +from time_tracker_api.activities import activities_api +api.add_namespace(activities_api.ns) diff --git a/time_tracker_api/projects/projects_endpoints.py b/time_tracker_api/projects/projects_api.py similarity index 96% rename from time_tracker_api/projects/projects_endpoints.py rename to time_tracker_api/projects/projects_api.py index eabc6fa8..5cbbd0f1 100644 --- a/time_tracker_api/projects/projects_endpoints.py +++ b/time_tracker_api/projects/projects_api.py @@ -2,7 +2,7 @@ from .projects_model import project_dao from time_tracker_api.errors import MissingResource -ns = Namespace('projects', description='Api for resource `Projects`') +ns = Namespace('projects', description='API for projects (clients)') @ns.route('/') class Projects(Resource):