summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2022-12-21 15:17:44 +0700
committerIT Fixcomart <it@fixcomart.co.id>2022-12-21 15:17:44 +0700
commit3cae188ec17df24e8205c43c72e91b358e836452 (patch)
tree191d348efde4b540c035fda70bf889b49f596730
parenta553bc46cd42aa5e56a9e438d959c32bd70d10b4 (diff)
use jwt and api user update
-rw-r--r--indoteknik_api/controllers/api_v1/user.py85
-rw-r--r--indoteknik_api/models/__init__.py1
-rw-r--r--indoteknik_api/models/res_users.py18
3 files changed, 78 insertions, 26 deletions
diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py
index 41581961..0e87144a 100644
--- a/indoteknik_api/controllers/api_v1/user.py
+++ b/indoteknik_api/controllers/api_v1/user.py
@@ -3,10 +3,35 @@ from odoo import http
from odoo.http import request
from odoo.tools.config import config
import random, string
+import jwt
class Auth(controller.Controller):
prefix = '/api/v1/'
+ jwt_secret_key = "NTNv7j0TuYARvmNMmWXo6fKvM4o6nvaUi9ryX38ZHL1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiTqJACs1J0apruOOJCggOtkjB4c"
+
+ def get_user_by_email(self, email):
+ return request.env['res.users'].search([
+ ('login', '=', email),
+ ('active', 'in', [True, False])
+ ])
+
+ def create_user_token(self, user):
+ return jwt.encode({'id': user.id}, self.jwt_secret_key)
+
+ def verify_user_token(self, user, token):
+ try:
+ user_token = jwt.decode(token, self.jwt_secret_key, algorithms=['HS256'])
+ if user.id != user_token['id']:
+ return False
+ return True
+ except:
+ return False
+
+ def response_with_token(self, user):
+ data = request.env['res.users'].api_single_response(user)
+ data['token'] = self.create_user_token(user)
+ return data
@http.route(prefix + 'user/login', auth='public', methods=['POST'], csrf=False)
def login(self, **kw):
@@ -18,7 +43,7 @@ class Auth(controller.Controller):
if not email or not password:
return self.response(code=400, description='email and password is required')
- user = self.get_user(email)
+ user = self.get_user_by_email(email)
if user and not user.active:
return self.response({
'is_auth': False,
@@ -28,15 +53,11 @@ class Auth(controller.Controller):
try:
uid = request.session.authenticate(config.get('db_name'), email, password)
user = request.env['res.users'].browse(uid)
- return self.response({
+ data = {
'is_auth': True,
- 'user': {
- 'id': user.id,
- 'name': user.name,
- 'email': user.login,
- 'external': user.share
- }
- })
+ 'user': self.response_with_token(user)
+ }
+ return self.response(data)
except:
return self.response({
'is_auth': False,
@@ -54,7 +75,7 @@ class Auth(controller.Controller):
if not name or not email or not password:
return self.response(code=400, description='email, name and password is required')
- user = self.get_user(email)
+ user = self.get_user_by_email(email)
if user:
return self.response({
@@ -72,16 +93,13 @@ class Auth(controller.Controller):
return self.response({'register': True})
- def get_user(self, email):
- return request.env['res.users'].search([('login', '=', email), ('active', 'in', [True, False])])
-
@http.route(prefix + 'user/activation-request', auth='public', methods=['POST'], csrf=False)
def request_activation_user(self, **kw):
if not self.authenticate():
return self.response(code=401, description='Unauthorized')
email = kw.get('email')
- user = self.get_user(email)
+ user = self.get_user_by_email(email)
if not user:
return self.response({'activation_request': False, 'reason': 'NOT_FOUND'})
@@ -93,14 +111,34 @@ class Auth(controller.Controller):
return self.response({
'activation_request': True,
'token': user.activation_token,
- 'user': {
- 'id': user.id,
- 'name': user.name,
- 'email': user.login,
- 'external': user.share
- }
})
+
+ @http.route(prefix + 'user/<id>', auth='public', methods=['PUT'], csrf=False)
+ def update_user(self, **kw):
+ if not self.authenticate():
+ return self.response(code=401, description='Unauthorized')
+
+ id = kw.get('id')
+ if not id:
+ return self.response(code=400, description='id is required')
+
+ user = request.env['res.users'].search([('id', '=', id)], limit=1)
+ if not user:
+ return self.response(code=400, description='User not found')
+
+ token = kw.get('token')
+ is_verify = self.verify_user_token(user, token)
+ if not is_verify:
+ return self.response(code=401, description='Unauthorized')
+
+ allowed_field = ['name', 'email', 'phone', 'mobile', 'password']
+ for field in allowed_field:
+ user[field] = kw.get(field, '')
+ return self.response({
+ 'user': self.response_with_token(user)
+ })
+
@http.route(prefix + 'user/activation', auth='public', methods=['POST'], csrf=False)
def activation_user(self, **kw):
if not self.authenticate():
@@ -118,10 +156,5 @@ class Auth(controller.Controller):
user.activation_token = ''
return self.response({
'activation': True,
- 'user': {
- 'id': user.id,
- 'name': user.name,
- 'email': user.login,
- 'external': user.share
- }
+ 'user': self.response_with_token(user)
}) \ No newline at end of file
diff --git a/indoteknik_api/models/__init__.py b/indoteknik_api/models/__init__.py
index 25f6997f..3e00e2f0 100644
--- a/indoteknik_api/models/__init__.py
+++ b/indoteknik_api/models/__init__.py
@@ -2,4 +2,5 @@ from . import blog_post
from . import product_pricelist
from . import product_product
from . import product_template
+from . import res_users
from . import x_manufactures \ No newline at end of file
diff --git a/indoteknik_api/models/res_users.py b/indoteknik_api/models/res_users.py
new file mode 100644
index 00000000..608ec4df
--- /dev/null
+++ b/indoteknik_api/models/res_users.py
@@ -0,0 +1,18 @@
+from odoo import models
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ def api_single_response(self, res_user, with_detail=''):
+ data = {
+ 'id': res_user.id,
+ 'name': res_user.name,
+ 'email': res_user.login,
+ 'phone': res_user.phone or '',
+ 'mobile': res_user.mobile or '',
+ 'external': res_user.share
+ }
+
+ return data
+