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
Overview
The Web3 Foundation has contracted TogetherCrew to deliver a Twitter Dashboard for monitoring community health.
High Level Solution
/auth/twitter/twitter/:handle/twitter/:handle/refreshx hours- show datax hours- show data + propose refresh (button)/twitter/:handle/refreshshould create a saga, initiate the choreography and respond with asagaId/saga/:sagaId/twitter/:handle/refresh)TWITTER_REFRESHchoreography with transactions:QUEUE.TWITTER_BOT, event:Event.TWITTER_BOT.EXTRACT}QUEUE.TWITTER_ANALYZER, event:Event.TWITTER_ANALYZER.RUN}QUEUE.TWITTER_BOT, event:Event.TWITTER_BOT.SEND_MESSAGE}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: ResponseBy Service
api
/twitter/:handleupon successful authenticationtwitter/:handle/refreshEvent.TWITTER_BOT.EXTRACTonQueue.TWITTER_BOTtwitter/:handle/metrics/followers(tbd)twitter/:handle/metrics/posts(tbd)/saga/:sagaIdbroker libraries (py + ts)
TWITTER_REFRESHchoreographyQueue.TWITTER_BOTqueueQueue.TWITTER_ANALYZERqueueEvent.TWITTER_BOT.EXTRACTeventEvent.TWITTER_BOT.SEND_MESSAGEeventEvent.TWITTER_ANALYZER.RUNeventtwitter-bot
based on python-service
server
Event.TWITTER_BOT.EXTRACTonQueue.TWITTER_BOTworker
Event.TWITTER_ANALYZER.RUNonQUEUE.TWITTER_ANALYZERtwitter-analyzer
based on python-service
server
Event.TWITTER_ANALYZER.RUNonQueue.TWITTER_ANALYZERworker
Event.TWITTER_BOT.SEND_MESSAGEonQueue.TWITTER_BOTfrontend
/auth/twitterendpoint (authentication)/twitter/:handleendpoint (dashboard)/saga/:sagaId