-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Overview
The Web3 Foundation has contracted TogetherCrew to deliver a Twitter Dashboard for monitoring community health.
High Level Solution
- Create an endpoint
/auth/twitter - The user is prompted to authenticate with Twitter
- Upon successful authentication, the user should be directed to the page
/twitter/:handle - Cases
- No data - call the api endpoint
/twitter/:handle/refresh - Data
- Less than
x hours- show data - More than
x hours- show data + propose refresh (button)
- Less than
- No data - call the api endpoint
- While refreshing data, we should show a progress bar
/twitter/:handle/refreshshould create a saga, initiate the choreography and respond with asagaId- The frontend should open a socket to
/saga/:sagaId - The progress bar should be updated based on the status of the saga transactions
- States:
- TWITTER_BOT - NOT_STARTED
- TWITTER_BOT - IN_PROGRESS
- TWITTER_ANALYZER - NOT_STARTED
- TWITTER_ANALYZER - IN_PROGRESS
- Refresh (
/twitter/:handle/refresh)- Create a saga with
TWITTER_REFRESHchoreography with transactions:- { queue:
QUEUE.TWITTER_BOT, event:Event.TWITTER_BOT.EXTRACT} - { queue:
QUEUE.TWITTER_ANALYZER, event:Event.TWITTER_ANALYZER.RUN} - { queue:
QUEUE.TWITTER_BOT, event:Event.TWITTER_BOT.SEND_MESSAGE}
- { queue:
- Create a saga with
Workflow
sequenceDiagram
title Twitter Integration
actor user
participant frontend
participant api
participant rabbit-mq
participant twitter-bot-server
participant twitter-bot-redis
participant twitter-bot-worker
participant twitter-analyzer-server
participant twitter-analyzer-redis
participant twitter-analyzer-worker
participant twitter
user -->> frontend: Goes to /twitter
frontend -->>+api: Authenticate using Twitter
api -->>+twitter: Authenticate
twitter -->>-api: Response
api -->>-frontend: Authenticated
frontend -->> frontend: Redirect to /twitter/:handle
frontend -->>+api: GET /twitter/:handle/refresh
api -->> rabbit-mq: Publish(Queue.TWITTER_BOT, Event.TWITTER_BOT.EXTRACT)
api -->>- frontend: Response (SagaId)
frontend --> api: Subscribe to socket /saga/:sagaId
rabbit-mq -->> twitter-bot-server: Subscribe(Queue.TWITTER_BOT, Event.TWITTER_BOT.EXTRACT)
twitter-bot-server -->> twitter-bot-redis: Enqueue Job
twitter-bot-redis -->>+twitter-bot-worker: Dequeue Job
twitter-bot-worker -->> twitter-bot-worker: Run extraction script
twitter-bot-worker -->>-rabbit-mq: Publish(Queue.TWITTER_ANALYZER, Event.TWITTER_ANALYZER.RUN)
rabbit-mq -->> twitter-analyzer-server: Subscribe(Queue.TWITTER_ANALYZER, Event.TWITTER_ANALYZER.RUN)
twitter-analyzer-server -->> twitter-analyzer-redis: Enqueue Job
twitter-analyzer-redis -->>+twitter-analyzer-worker: Dequeue Job
twitter-analyzer-worker -->> twitter-analyzer-worker: Run analytics script
twitter-analyzer-worker -->>-rabbit-mq: Publish(Queue.TWITTER_BOT, Event.TWITTER_BOT.SEND_MESSAGE)
rabbit-mq -->> twitter-bot-server: Subscribe(Queue.TWITTER_BOT, Event.TWITTER_BOT.SEND_MESSAGE)
twitter-bot-server -->> twitter-bot-redis: Enqueue Job
twitter-bot-redis -->> twitter-bot-worker: Dequeue Job
twitter-bot-worker -->>+ twitter: Send message
twitter -->>- twitter-bot-worker: Response
frontend -->>+ api: GET /twitter/:handle/followers
api -->>- frontend: Response
frontend -->>+ api: GET /twitter/:handle/posts
api -->>- frontend: Response
frontend -->>+ api: GET /twitter/:handle/metrics
api -->>- frontend: Response
By Service
api
- add passport-twitter
- create account in neo4j (opportunity to migrate away from mongodb)
- redirect to
/twitter/:handleupon successful authentication - endpoints:
twitter/:handle/refresh- create saga
- publish
Event.TWITTER_BOT.EXTRACTonQueue.TWITTER_BOT - respond with saga id
twitter/:handle/metrics/followers(tbd)twitter/:handle/metrics/posts(tbd)
- websocket:
/saga/:sagaId
broker libraries (py + ts)
- add
TWITTER_REFRESHchoreography - add
Queue.TWITTER_BOTqueue - add
Queue.TWITTER_ANALYZERqueue - add
Event.TWITTER_BOT.EXTRACTevent - add
Event.TWITTER_BOT.SEND_MESSAGEevent - add
Event.TWITTER_ANALYZER.RUNevent
twitter-bot
based on python-service
server
- subscribe to
Event.TWITTER_BOT.EXTRACTonQueue.TWITTER_BOT - add to queue
- acknowledge
worker
- run extraction (what variable do we need to pass? i.e. timeframe)
- store data to neo4j database
- publish
Event.TWITTER_ANALYZER.RUNonQUEUE.TWITTER_ANALYZER
twitter-analyzer
based on python-service
server
- subscribe to
Event.TWITTER_ANALYZER.RUNonQueue.TWITTER_ANALYZER - add to queue
- acknowledge
worker
- run analysis
- store data in neo4j
- publish
Event.TWITTER_BOT.SEND_MESSAGEonQueue.TWITTER_BOT
frontend
- views
/auth/twitterendpoint (authentication)/twitter/:handleendpoint (dashboard)
- websocket:
/saga/:sagaId
Metadata
Metadata
Labels
No labels