Skip to content

Commit 23e8125

Browse files
committed
beta
1 parent 1b9ea0b commit 23e8125

File tree

7 files changed

+395
-0
lines changed

7 files changed

+395
-0
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## Installation
2+
```
3+
pip3 install -r requiremetns.txt
4+
```
5+
6+
## Configuration
7+
Change account name and key. You will find thus on portal.azure.com
8+
9+
## Usage Storage Client
10+
```
11+
python3 main.py
12+
```
13+
![preview](swagger.png)

db.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from hashlib import sha224
2+
from json import dumps
3+
from azure.cosmosdb.table import EntityProperty as ep
4+
from azure.cosmosdb.table.tableservice import TableService
5+
from azure.cosmosdb.table.models import EdmType
6+
import message_pb2
7+
8+
9+
"""
10+
Author: Rafal Marguzewicz
11+
Email: info@pceuropa.net
12+
Github: https://github.com/pceuropa/
13+
Description: App need Azure account name and key to run correctly on http://127.0.0.1:5000/
14+
"""
15+
16+
17+
ACCOUNT_NAME = 'account_name'
18+
ACCOUNT_KEY = 'acount_key'
19+
USER_TABLE_NAME = 'users'
20+
MESSAGE_TABLE_NAME = 'message'
21+
email = 'test@email.net'
22+
row_key = '001'
23+
24+
25+
class Db(object):
26+
27+
ts = None
28+
29+
def __init__(self):
30+
"""Init connection with cosmosdb"""
31+
self.ts = TableService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)
32+
33+
def migrate(self):
34+
""" Create tabel if not exists"""
35+
if not self.ts.exists(USER_TABLE_NAME):
36+
self.ts.create_table(USER_TABLE_NAME)
37+
38+
if not self.ts.exists(MESSAGE_TABLE_NAME):
39+
self.ts.create_table(MESSAGE_TABLE_NAME)
40+
41+
def get_all_users(self):
42+
"""select email from user"""
43+
return [i['PartitionKey'] for i in self.ts.query_entities(USER_TABLE_NAME)]
44+
45+
def create_user(self, data=None):
46+
bjson = ep(EdmType.BINARY, dumps({
47+
'email': data['email'],
48+
'password': sha224(bytes(data['password'], encoding='utf-8')).hexdigest(),
49+
'full_name': data['full_name']
50+
}))
51+
52+
user = {
53+
'PartitionKey': data['email'],
54+
'RowKey': row_key,
55+
'info': bjson
56+
}
57+
58+
if (self.ts.insert_or_replace_entity(USER_TABLE_NAME, user)):
59+
return {'success': True}
60+
61+
def delete_user(self, email=None):
62+
if (self.ts.delete_entity(USER_TABLE_NAME, email, row_key)):
63+
return {'success': True}
64+
65+
def create_message(self, email=None, message=None):
66+
""" Create message in protobuf"""
67+
proto_message = message_pb2.Message()
68+
proto_message.title = message['title']
69+
proto_message.content = message['content']
70+
proto_message.magic_number = message['magic_number']
71+
details = ep(EdmType.BINARY, str(proto_message))
72+
73+
bmessage = {
74+
'PartitionKey': email,
75+
'RowKey': row_key,
76+
'details': details,
77+
}
78+
79+
if (self.ts.insert_or_replace_entity(MESSAGE_TABLE_NAME, bmessage)):
80+
return {'success': True}
81+
82+
def get_user(self, email=''):
83+
return self.ts.get_entity(USER_TABLE_NAME, email, row_key)
84+
85+
def get_message(self, email=''):
86+
return self.ts.get_entity(MESSAGE_TABLE_NAME, email, row_key)
87+
88+
def get_messages(self):
89+
messages = self.ts.query_entities(MESSAGE_TABLE_NAME)
90+
return list(messages)

main.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from flask import Flask
2+
from flask_restplus import Api, Resource, fields
3+
from db import Db
4+
5+
# Extensions initialization
6+
# =========================
7+
app = Flask(__name__)
8+
api = Api(app)
9+
ns = api.namespace('users', description='TODO operations')
10+
11+
user = api.model('User', {
12+
'id': fields.Integer(readOnly=True, description='The task unique identifier'),
13+
'email': fields.String(required=True, description='first and last name'),
14+
'full_name': fields.String(required=True, description='first and last name'),
15+
'password': fields.String(required=True, description='password')
16+
17+
})
18+
19+
message = api.model('Message', {
20+
'title': fields.String(required=True, description='title'),
21+
'content': fields.String(required=True, description='ble'),
22+
'magic_number': fields.Integer(required=True),
23+
})
24+
25+
db = Db()
26+
db.migrate()
27+
28+
29+
@ns.route('/')
30+
class CreateUser(Resource):
31+
32+
@ns.doc('get_all_users')
33+
def get(self):
34+
return list(db.get_all_users()), 201
35+
36+
@ns.expect(user)
37+
@ns.doc('create_user')
38+
def post(self):
39+
return db.create_user(api.payload), 201
40+
41+
42+
@ns.route('/<email>')
43+
@ns.doc('delete_user')
44+
class DeleteUser(Resource):
45+
46+
def delete(self, email):
47+
return db.create_user(email), 201
48+
49+
50+
@ns.route('/<email>/message')
51+
@ns.doc('create_message')
52+
class Message(Resource):
53+
54+
def get(self, email):
55+
return email, 201
56+
57+
@ns.expect(message)
58+
def post(self, email):
59+
return db.create_message(email, api.payload)
60+
61+
62+
@ns.route('/message')
63+
class GetMessage(Resource):
64+
65+
def get(self):
66+
return db.get_messages(), 201
67+
68+
69+
if __name__ == '__main__':
70+
app.run()

message.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
syntax = "proto3";
2+
3+
message Message{
4+
string title = 1;
5+
string content = 2;
6+
int32 magic_number = 3;
7+
}

message_pb2.py

Lines changed: 83 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)