diff --git a/app/api/middleware.py b/app/api/middleware.py index 2c183e7..5e3d6b5 100644 --- a/app/api/middleware.py +++ b/app/api/middleware.py @@ -6,8 +6,18 @@ from app.core._secrets import hot_seed from app.core.logger import make_log from app.core.models.keys import KnownKey from app.core.models._telegram.wrapped_bot import Wrapped_CBotChat +from app.core.models.user_activity import UserActivity from app.core.models.user import User from app.core.storage import Session +from datetime import datetime, timedelta + + +def attach_headers(response): + response.headers["Access-Control-Allow-Origin"] = "*" + response.headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS" + response.headers["Access-Control-Allow-Headers"] = "Origin, Content-Type, Accept, Authorization, Referer, User-Agent, Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site" + response.headers["Access-Control-Allow-Credentials"] = "true" + return response async def try_authorization(request): @@ -59,6 +69,38 @@ async def try_authorization(request): request.ctx.user_uploader_wrapper = Wrapped_CBotChat(request.app.ctx.memory._telegram_bot, chat_id=user.telegram_id, db_session=request.ctx.db_session) request.ctx.user_client_wrapper = Wrapped_CBotChat(request.app.ctx.memory._client_telegram_bot, chat_id=user.telegram_id, db_session=request.ctx.db_session) + activity_meta = {} + try: + activity_meta["path"] = request.path + except: + pass + + try: + activity_meta["method"] = request.method + except: + pass + + try: + activity_meta["ip"] = (request.headers['X-Forwarded-for'] if 'X-Forwarded-for' in request.headers else None) \ + or request.remote_addr or request.ip + except: + pass + + try: + activity_meta["headers"] = dict(request.headers) + except: + pass + + new_user_activity = UserActivity( + type="API_V1_REQUEST", + meta=activity_meta, + user_id=user.id, + user_ip=request.ip, + created=datetime.now() + ) + request.ctx.db_session.add(new_user_activity) + request.ctx.db_session.commit() + async def try_service_authorization(request): signature = request.headers.get('X-Service-Signature') @@ -76,12 +118,15 @@ async def try_service_authorization(request): async def attach_user_to_request(request): + if request.method == 'OPTIONS': + return attach_headers(sanic_response.text("OK")) + + request.ctx.db_session = Session() request.ctx.verified_hash = None request.ctx.user = None request.ctx.user_key = None - request.ctx.user_uploader_wrapper = None - request.ctx.user_client_wrapper = None - request.ctx.db_session = Session() + request.ctx.user_uploader_wrapper = Wrapped_CBotChat(request.app.ctx.memory._telegram_bot, db_session=request.ctx.db_session) + request.ctx.user_client_wrapper = Wrapped_CBotChat(request.app.ctx.memory._client_telegram_bot, db_session=request.ctx.db_session) await try_authorization(request) await try_service_authorization(request) @@ -100,8 +145,5 @@ async def close_request_handler(request, response): async def close_db_session(request, response): request, response = await close_request_handler(request, response) - response.headers["Access-Control-Allow-Origin"] = "*" - response.headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS" - response.headers["Access-Control-Allow-Headers"] = "Origin, Content-Type, Accept, Authorization, Referer, User-Agent, Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site" - response.headers["Access-Control-Allow-Credentials"] = "true" + response = attach_headers(response) return response diff --git a/app/api/routes/_blockchain.py b/app/api/routes/_blockchain.py index 78ae0e8..bb7881a 100644 --- a/app/api/routes/_blockchain.py +++ b/app/api/routes/_blockchain.py @@ -77,8 +77,8 @@ async def s_api_v1_blockchain_send_new_content_message(request): metadata_content = await create_metadata_for_item( request.ctx.db_session, - title=request.json['title'], - cover_url=request.json['image'], + title=f"{', '.join(request.json['authors'])} - {request.json['title']}", + cover_url=f"{PROJECT_HOST}/api/v1/storage/{image_content_cid.serialize_v2()}" if image_content_cid else None, authors=request.json['authors'] ) @@ -108,8 +108,8 @@ async def s_api_v1_blockchain_send_new_content_message(request): .store_ref( begin_cell() .store_coins(int(request.json['price'])) - .store_coins(int(1000000 * 10 ** 9)) - .store_coins(int(5000000 * 10 ** 9)) + .store_coins(int(100000000 * 10 ** 9)) + .store_coins(int(500000000 * 10 ** 9)) .end_cell() ) .store_maybe_ref(royalties_dict.end_dict()) diff --git a/app/core/content/utils.py b/app/core/content/utils.py index 6f9a8b8..ca23298 100644 --- a/app/core/content/utils.py +++ b/app/core/content/utils.py @@ -64,7 +64,7 @@ async def create_metadata_for_item( # 'trait_type': 'Artist', # 'value': 'Unknown' # }, - ] + ], } if cover_url: item_metadata['image'] = cover_url @@ -73,8 +73,6 @@ async def create_metadata_for_item( ''.join([_a_ch for _a_ch in _a if len(_a_ch.encode()) == 1]) for _a in (authors or [])[:500] ] - signer = Signer(hot_seed) - # Upload file metadata_bin = json.dumps(item_metadata).encode() metadata_hash = sha256(metadata_bin).digest() diff --git a/app/core/models/__init__.py b/app/core/models/__init__.py index 2a827e1..b7cce26 100644 --- a/app/core/models/__init__.py +++ b/app/core/models/__init__.py @@ -7,3 +7,4 @@ from app.core.models.transaction import UserBalance, InternalTransaction from app.core.models.user import User from app.core.models.wallet_connection import WalletConnection from app.core.models.messages import KnownTelegramMessage +from app.core.models.user_activity import UserActivity diff --git a/app/core/models/user_activity.py b/app/core/models/user_activity.py new file mode 100644 index 0000000..6f39ef6 --- /dev/null +++ b/app/core/models/user_activity.py @@ -0,0 +1,18 @@ + +from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, DateTime, JSON, Boolean +from sqlalchemy.orm import relationship +from .base import AlchemyBase + + +class UserActivity(AlchemyBase): + __tablename__ = 'users_activity' + + id = Column(Integer, autoincrement=True, primary_key=True) + type = Column(String(64), nullable=False) + meta = Column(JSON, nullable=False, default={}) + + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + user_ip = Column(String(64), nullable=True) + created = Column(DateTime, nullable=False, default=0) + + user = relationship('User', uselist=False, foreign_keys=[user_id])