Skip to content

Commit 7f2c62e

Browse files
Merge pull request #3 from vectornguyen76/develop
Develop
2 parents fb9e90d + 8c10703 commit 7f2c62e

25 files changed

+355
-74
lines changed
Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,46 @@
1-
name: hello-world
2-
on: push
1+
name: development
2+
on:
3+
pull_request:
4+
branches: develop
5+
6+
push:
7+
branches:
8+
- develop
39
jobs:
4-
my-job:
10+
build-test:
511
runs-on: ubuntu-latest
12+
services:
13+
postgres:
14+
image: postgres:13.3
15+
env:
16+
POSTGRES_USER: db_user
17+
POSTGRES_PASSWORD: db_password
18+
POSTGRES_DB: db_test
19+
ports:
20+
- 5432:5432
21+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
622
steps:
7-
- name: my-step
8-
run: echo "Hello World with Github Actions"
23+
- name: Checkout code
24+
uses: actions/checkout@v2
25+
26+
- name: Cache Python dependencies
27+
uses: actions/cache@v2
28+
with:
29+
path: ~/.cache/pip
30+
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
31+
restore-keys: |
32+
${{ runner.os }}-pip-
33+
34+
- name: Set up Python 3.9
35+
uses: actions/setup-python@v2
36+
with:
37+
python-version: 3.9
38+
39+
- name: Install Python dependencies
40+
run: python -m pip install -r requirements.txt
41+
42+
- name: Unit Tests and Integration Tests
43+
env:
44+
DATABASE_TEST_URL: postgresql://db_user:db_password@localhost/db_test
45+
run: python -m flask tests
46+

.github/workflows/production_pipeline.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
name: hello-world
2-
on: push
1+
name: production
2+
on:
3+
pull_request:
4+
branches: main
35
jobs:
46
my-job:
57
runs-on: ubuntu-latest
Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,41 @@
1-
name: hello-world
2-
on: push
1+
name: staging
2+
on:
3+
pull_request:
4+
branches: staging
35
jobs:
4-
my-job:
6+
build-test:
57
runs-on: ubuntu-latest
8+
services:
9+
postgres:
10+
image: postgres:13.3
11+
env:
12+
POSTGRES_USER: db_user
13+
POSTGRES_PASSWORD: db_password
14+
POSTGRES_DB: db_test
15+
ports:
16+
- 5432:5432
17+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
618
steps:
7-
- name: my-step
8-
run: echo "Hello World with Github Actions"
19+
- name: Checkout code
20+
uses: actions/checkout@v2
21+
22+
- name: Cache Python dependencies
23+
uses: actions/cache@v2
24+
with:
25+
path: ~/.cache/pip
26+
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
27+
restore-keys: |
28+
${{ runner.os }}-pip-
29+
30+
- name: Set up Python 3.9
31+
uses: actions/setup-python@v2
32+
with:
33+
python-version: 3.9
34+
35+
- name: Install Python dependencies
36+
run: python -m pip install -r requirements.txt
37+
38+
- name: Unit Tests and Integration Tests
39+
env:
40+
DATABASE_TEST_URL: postgresql://db_user:db_password@localhost/db_test
41+
run: python -m flask tests

app/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import os
22
from flask import Flask
3-
from app.extention import migrate, jwt, cors
3+
from app.extention import migrate, cors
4+
from app.utils.auth import jwt
5+
from app.utils.principal import principal
46
from app.utils.logging import configure_logging
57
from app.db import db
68
from app.blueprint import register_routing
@@ -15,6 +17,7 @@ def create_app(settings_module):
1517
migrate.init_app(app, db)
1618
jwt.init_app(app)
1719
cors.init_app(app, supports_credentials='true' ,resources={r"*": { "origins": "*" }})
20+
principal.init_app(app)
1821
manage.init_app(app)
1922

2023
# Logging configuration
@@ -25,6 +28,5 @@ def create_app(settings_module):
2528

2629
return app
2730

28-
2931
settings_module = os.getenv('APP_SETTINGS_MODULE')
3032
app = create_app(settings_module)

app/controllers/permission_controller.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,23 @@
55
from flask_jwt_extended import jwt_required
66
from app.schemas.user_schema import PermissionSchema, UpdatePermissionRoleSchema
77

8+
# Define permissions
9+
read_permission = Permission(RoleNeed('read'))
10+
write_permission = Permission(RoleNeed('write'))
11+
812
blp = Blueprint("Permission", __name__, description="Permission API")
913

1014
@blp.route("/permission")
1115
class PermissionList(MethodView):
1216
@jwt_required()
17+
@read_permission.require(http_exception=403)
1318
@blp.response(200, PermissionSchema(many=True))
1419
def get(self):
1520
result = permission_service.get_all_permission()
1621
return result
1722

1823
@jwt_required()
24+
@write_permission.require(http_exception=403)
1925
@blp.arguments(PermissionSchema)
2026
def post(self, qa_history_data):
2127
result = permission_service.post_permission(qa_history_data)
@@ -24,12 +30,14 @@ def post(self, qa_history_data):
2430
@blp.route("/permission/<int:permission_id>")
2531
class Permission(MethodView):
2632
@jwt_required()
33+
@read_permission.require(http_exception=403)
2734
@blp.response(200, PermissionSchema)
2835
def get(self, permission_id):
2936
result = permission_service.get_permission(permission_id)
3037
return result
3138

3239
@jwt_required()
40+
@write_permission.require(http_exception=403)
3341
@blp.arguments(PermissionSchema)
3442
def put(self, permission_data, permission_id):
3543
result = permission_service.update_permission(permission_data, permission_id)
@@ -38,6 +46,7 @@ def put(self, permission_data, permission_id):
3846
@blp.route("/permission-role-update")
3947
class PermissionRole(MethodView):
4048
@jwt_required()
49+
@write_permission.require(http_exception=403)
4150
@blp.arguments(UpdatePermissionRoleSchema)
4251
def put(self, permission_data):
4352
result = role_permission_service.update_roles_to_permission(permission_data)

app/controllers/role_controller.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,24 @@
55
from flask_jwt_extended import jwt_required
66
from app.schemas.user_schema import RoleSchema, UpdateRolePermissionSchema
77

8+
# Define permissions
9+
read_permission = Permission(RoleNeed('read'))
10+
write_permission = Permission(RoleNeed('write'))
11+
delete_permission = Permission(RoleNeed('delete'))
12+
813
blp = Blueprint("Role", __name__, description="Role API")
914

1015
@blp.route("/role")
1116
class RoleList(MethodView):
1217
@jwt_required()
18+
@read_permission.require(http_exception=403)
1319
@blp.response(200, RoleSchema(many=True))
1420
def get(self):
1521
result = role_service.get_all_role()
1622
return result
1723

1824
@jwt_required()
25+
@write_permission.require(http_exception=403)
1926
@blp.arguments(UpdateRolePermissionSchema)
2027
def post(self, qa_history_data):
2128
result = role_service.post_role(qa_history_data)
@@ -24,18 +31,21 @@ def post(self, qa_history_data):
2431
@blp.route("/role/<int:role_id>")
2532
class Role(MethodView):
2633
@jwt_required()
34+
@read_permission.require(http_exception=403)
2735
@blp.response(200, RoleSchema)
2836
def get(self, role_id):
2937
result = role_service.get_role(role_id)
3038
return result
3139

3240
@jwt_required()
41+
@write_permission.require(http_exception=403)
3342
@blp.arguments(UpdateRolePermissionSchema)
3443
def put(self, role_data, role_id):
3544
result = role_service.update_role(role_data, role_id)
3645
return result
3746

3847
@jwt_required()
48+
@delete_permission.require(http_exception=403)
3949
def delete(self, role_id):
4050
result = role_service.delete_role(role_id)
4151
return result

app/controllers/user_controller.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
from app.services import user_service
2-
from flask_jwt_extended import jwt_required, get_jwt, get_jwt_identity, create_access_token
2+
from flask_jwt_extended import jwt_required, get_jwt
33
from flask.views import MethodView
4-
from flask_smorest import Blueprint, abort
4+
from flask_smorest import Blueprint
55
from flask_principal import Permission, RoleNeed
66
from app.schemas.user_schema import *
77

8-
# Define some permissions
9-
# admin_permission = Permission(RoleNeed('user_management'))
8+
# Define permissions
9+
read_permission = Permission(RoleNeed('read'))
10+
write_permission = Permission(RoleNeed('write'))
11+
delete_permission = Permission(RoleNeed('delete'))
1012

1113
blp = Blueprint("User", __name__, description="User API")
1214

1315
@blp.route("/user")
1416
class UserList(MethodView):
1517
@jwt_required()
16-
# @admin_permission.require(http_exception=403)
18+
@read_permission.require(http_exception=403)
1719
@blp.response(200, UserSchema(many=True))
1820
def get(self):
1921
result = user_service.get_all_user()
@@ -22,26 +24,23 @@ def get(self):
2224
@blp.route("/user/<int:user_id>")
2325
class User(MethodView):
2426
@jwt_required()
27+
@read_permission.require(http_exception=403)
2528
@blp.response(200, UserSchema)
2629
def get(self, user_id):
2730
result = user_service.get_user(user_id)
2831
return result
2932

3033
@jwt_required()
34+
@write_permission.require(http_exception=403)
3135
@blp.arguments(UserUpdateSchema)
3236
def put(self, user_data, user_id):
3337
result = user_service.update_user(user_data, user_id)
3438
return result
35-
36-
@jwt_required()
37-
def delete(self, user_id):
38-
result = user_service.delete_user(user_id)
39-
return result
4039

4140
@blp.route("/block-user/<int:user_id>")
4241
class BlockUser(MethodView):
4342
@jwt_required()
44-
# @admin_permission.require(http_exception=403)
43+
@delete_permission.require(http_exception=403)
4544
@blp.arguments(UpdateBlockUserSchema)
4645
def put(self, user_data, user_id):
4746
result = user_service.update_block_user(user_data, user_id)

app/extention.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from flask_migrate import Migrate
22
from flask_jwt_extended import JWTManager
33
from flask_cors import CORS
4+
from flask_principal import Principal
45

56
migrate = Migrate()
67
jwt = JWTManager()
78
cors = CORS()
9+
principal = Principal()

app/models/permission_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ class PermissionModel(db.Model):
55

66
id = db.Column(db.Integer, primary_key=True)
77
name = db.Column(db.String(), unique=True, nullable=False)
8-
route = db.Column(db.String(), unique=True, nullable=False)
8+
description = db.Column(db.String())
99
roles = db.relationship("RoleModel", back_populates="permissions", secondary="role_permission")
1010

app/models/user_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
class UserModel(db.Model):
55
__tablename__ = "user"
66

7-
id = db.Column(db.Integer, primary_key = True)
7+
id = db.Column(db.Integer, primary_key=True)
88
username = db.Column(db.String(80), unique=True, nullable=False)
99
password = db.Column(db.String(), nullable=False)
1010
block = db.Column(db.Boolean, default=False, nullable=False)

0 commit comments

Comments
 (0)