Services¶
Services are synonymous with what other frameworks might call endpoints
or views
.
For the sake of our application, let’s use services for getting a user’s most recent conversations and messages for a conversation.
Creating the services¶
We’ll name our endpoints @get-conversations
and @get-messages
and put them
in a file named services.py
.
from guillotina import configure
from guillotina.component import get_multi_adapter
from guillotina.interfaces import IContainer, IResourceSerializeToJsonSummary
from guillotina.utils import get_authenticated_user_id
from guillotina_chat.content import IConversation
@configure.service(for_=IContainer, name='@get-conversations',
permission='guillotina.Authenticated')
async def get_conversations(context, request):
results = []
conversations = await context.async_get('conversations')
user_id = get_authenticated_user_id(request)
async for conversation in conversations.async_values():
if user_id in getattr(conversation, 'users', []):
summary = await get_multi_adapter(
(conversation, request),
IResourceSerializeToJsonSummary)()
results.append(summary)
results = sorted(results, key=lambda conv: conv['creation_date'])
return results
@configure.service(for_=IConversation, name='@get-messages',
permission='guillotina.AccessContent')
async def get_messages(context, request):
results = []
async for message in context.async_values():
summary = await get_multi_adapter(
(message, request),
IResourceSerializeToJsonSummary)()
results.append(summary)
results = sorted(results, key=lambda mes: mes['creation_date'])
return results
And make sure to add the scan.
configure.scan('guillotina_chat.services')