{"id":25309311,"url":"https://github.com/luechtdiode/mobile-queue","last_synced_at":"2026-04-30T08:40:13.851Z","repository":{"id":148002842,"uuid":"101538997","full_name":"luechtdiode/mobile-queue","owner":"luechtdiode","description":"Digital and mobile queue for events, which allows the interested parties to share the waiting time for more meaningful activities as standing the whole time in the real queue.","archived":false,"fork":false,"pushed_at":"2022-04-19T20:52:31.000Z","size":12066,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-07T10:12:24.969Z","etag":null,"topics":["akka-http","akka-streams","angular","ionic","scala","websocket"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luechtdiode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-08-27T08:17:11.000Z","updated_at":"2021-11-14T23:29:35.000Z","dependencies_parsed_at":"2023-05-28T05:15:11.017Z","dependency_job_id":null,"html_url":"https://github.com/luechtdiode/mobile-queue","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/luechtdiode/mobile-queue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luechtdiode%2Fmobile-queue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luechtdiode%2Fmobile-queue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luechtdiode%2Fmobile-queue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luechtdiode%2Fmobile-queue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luechtdiode","download_url":"https://codeload.github.com/luechtdiode/mobile-queue/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luechtdiode%2Fmobile-queue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32459420,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["akka-http","akka-streams","angular","ionic","scala","websocket"],"created_at":"2025-02-13T12:53:01.948Z","updated_at":"2026-04-30T08:40:13.822Z","avatar_url":"https://github.com/luechtdiode.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mobile-Ticket-Queue\r\n\r\n[![Travis Build Status](https://travis-ci.org/luechtdiode/mobile-queue.svg?branch=master)](https://travis-ci.org/luechtdiode/mobile-queue.svg?branch=master)\r\n\r\nDigital and mobile queue for events, which allows the interested parties to share the waiting time for more meaningful activities as standing the whole time in the real queue.\r\n\r\n# Support as Tester\r\n## Try as Android-Device Tester and download Alpha-Version from Play-Store\r\n[Mobile Ticket Queue (alpha testversion) on Google Play-Store](https://play.google.com/store/apps/details?id=ch.seidel.mobile_ticket_queue\u0026rdid=ch.seidel.mobile_ticket_queue)\r\n\r\n## Try as Tester with Browser-Client\r\n[Mobile Ticket Queue as Browser App](https://mbq.sharevic.net/)\r\n\r\n# Support for Translations\r\nFeel free to translate the i18n-Files by forking this repo and publish a pull-request.\r\n\r\n# Architecture\r\n\r\n* Client-Server\r\n* Mobile-First\r\n* Hybrid Client to take advantage of device-apis such as Vibrate or Background-Mode\r\n## Entities\r\nEntity | Description\r\n-|-\r\nUser | A User is identified primarily by his used device's id. He can have more than one device-id, but then he should use a password. Actually, we just want to know his username.\r\nEvent | A Event represents a digital counter-desk for somewhat-ever kindful thing. On that digital counter-desk, User can issue tickets to be invited in the correct order of issuance.\r\nTicket | A Ticket represents the promise to be called, when the ticket-holders turn will start.\r\nClient | A Client is the physical connection to the User's device. If the user is online, he has always a Client per used device as companion. If the User uses two or more Clients, such as a Mobile-Device and a Tablet-Device at the same time, there will be two Clients instantiated. All messages from and to the user go through his device's Client. Also, all messages are propagated to all Clients of the user.\r\n## State-Handling\r\nAs it's a kind of CQRS-Application, new state comes from Events/Actions and is propagated to all subscribers\r\n### Backend-State\r\n* No persistence (atm),\r\n* Per Entity a Akka-Actor (Event =\u003e EventRegistryActor), could be regional shared (scaling)\r\n* Hierarchical Supervision (EventRegistryActor owns per Event a TicketRegistryActor)\r\n* Beyond, the UserRegistryActor as root-actor (could be outplaced or connected with a external user-service)\r\n* As Facade per Websocket-Connection exists a ClientActor.\r\n### Client-State\r\n* HTML5-LocalStore to remember Device-ID and Username\r\n* Not yet implemented Redux-Store.\r\n## Technology-Layers\r\nLayer | Technology\r\n-|-\r\nBackend | Java8, Scala, Akka-http\r\nApi | Rest, Websocket over https/wss\r\nFrontend | Ionic3 / Angular4, Rxjs, Cordova\r\n\r\n# Concepts\r\n## Ticket-Statehandling\r\n\r\n```\r\n          State |  Issued  |  Called  | Skipped |   Confirmed  |  Closed\r\n Actor (Action) |          |          |         |              |        \r\n ---------------|----------|----------|---------|--------------|--------\r\n User subscribe\t\t\t\t\t\t\t                          \r\n System -----------\u003eO\t\t\t\t\t\t\t\t\t\t\t\t   \r\n System (Next n) 1)[O----------O]-\u003eO\r\n                 2)                                    O-----------\u003eO\r\n                 3) O\u003c---------------------O\r\n   \r\n User (confirm)                O----------------------\u003eO                \r\n User (skip)     1)            O----------\u003eO\r\n                 2)[O----------O]-\u003eO                             \r\n User (unsubscribe)[O----------O-----------O]----------------------\u003eO  \r\n                                                              \r\n Statistic                                                    \r\n ---------------|----------|----------|---------|--------------|--------\r\n Sums           |             Waiting           |   Accepted   |        \r\n -----------------------------------------------------------------------\r\n```\r\n## Communication-Flow\r\n```\r\nFrom    \\     To | Event Registry     | Ticket Registry | User Registry      | ClientActor                | Web-Client     | Protocol\r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\nEvent Registry   |                    | IssueTicket     | EventCreated(*)    |                            |                | Akka\r\n                 |       ****         | CloseTicket     | EventUpdated(*)    |                            |                | Akka    \r\n                 |                    | EventUpdated    | EventDeleted(*)    |                            |                | Akka    \r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\nTicket Registry  |                    |                 |                    | TicketIssued               | **             | Akka\r\n                 |                    |                 |                    | TicketCalled               | **             | Akka\r\n                 |                    |      ****       |                    | TicketConfirmed            | **             | Akka                 \r\n                 |                    |                 |                    | TicketClosed               | **             | Akka\r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\nUser Registry    |                    |                 |                    | UserAuthenticated          | **             | Akka\r\n                 |                    |                 |                    | UserAuthenticationFailed   | **             | Akka\r\n                 |                    |                 |                    | TicketIssuedPropagated     | **             | Akka\r\n                 |                    |                 |                    | TicketCalledPropagated     | **             | Akka\r\n                 |                    |                 |       ****         | TicketConfirmedPropagated  | **             | Akka\r\n                 |                    |                 |                    | TicketClosedPropagated     | **             | Akka\r\n                 |                    |                 |                    | EventCreated               | **             | Akka\r\n                 |                    |                 |                    | EventUpdated               | **             | Akka\r\n                 |                    |                 |                    | EventDeleted               | **             | Akka\r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\nClientActor      |                    |                 |                    |                            | **\u003e\u003e           | WS\r\n                 | IssueEventTicket   | TicketConfirmed | Authenticate(*)    |                            |                | Akka          \r\n                 | CloseEventTicket   | TicketSkipped   | TicketIssued(*)    |                            |                | Akka\r\n                 |                    |                 | TicketCalled(*)    |           ****             |                | Akka\r\n                 |                    |                 | TicketConfirmed(*) |                            |                | Akka\r\n                 |                    |                 | TicketClosed(*)    |                            |                | Akka\r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\nWeb-Client       | request all events |                 | request user-names |                            |                | Rest         \r\n(Device-App)     | getNextTickets     |                 |                    |                            |                | Rest\r\n                 | addEvent           |                 |                    |                            |                | Rest\r\n                 | updateEvent        |                 |                    |                            |                | Rest\r\n                 | deleteEvent        |                 |                    |                            |      ****      | Rest\r\n                 |                    |                 |                    | HiImOnline                 |                | WS\r\n                 |                    |                 |                    | Subscribe                  |                | WS\r\n                 |                    |                 |                    | TicketConfirmed            |                | WS\r\n                 |                    |                 |                    | TicketSkipped              |                | WS\r\n-----------------|--------------------|-----------------|--------------------|----------------------------|----------------|---------\r\n\r\n(*) Propagation via user to broadcast the event to all connected Clients\r\n** Events, that are streamed to the Web-Client's Websocket\r\n\r\n```\r\n# Dev thoughts\r\n## Starting-point\r\n\r\n``sbt -Dsbt.version=0.13.15 new https://github.com/akka/akka-http-scala-seed.g8``\r\n## Technology- / Implementation- Motivations\r\n### Reacitive, (event-)stream-based\r\n* See [akka-streams-a-motivating-example from blog.colinbreck.com](http://blog.colinbreck.com/akka-streams-a-motivating-example/)\r\n* See [swagger-akka-http-sample from github.com/pjfanning](https://github.com/pjfanning/swagger-akka-http-sample)\r\n### CI\r\n* See [travis-integration1](https://github.com/svenlaater/travis-ci-ionic-yml)\r\n* See [travis-integration2](https://github.com/okode/ionic-travis)\r\n* See [travis s3 deployment](https://medium.com/@itsdavidthai/comprehensive-aws-ec2-deployment-with-travisci-guide-7cafa9c754fc)\r\n* See [use of travis fastlane](https://blog.fossasia.org/tag/travis/)\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluechtdiode%2Fmobile-queue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluechtdiode%2Fmobile-queue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluechtdiode%2Fmobile-queue/lists"}