{"id":26576640,"url":"https://github.com/getsentry/atlas","last_synced_at":"2025-03-23T03:24:11.809Z","repository":{"id":39004031,"uuid":"189525186","full_name":"getsentry/atlas","owner":"getsentry","description":"A map to your company","archived":false,"fork":false,"pushed_at":"2023-10-04T18:48:43.000Z","size":4332,"stargazers_count":22,"open_issues_count":38,"forks_count":3,"subscribers_count":45,"default_branch":"master","last_synced_at":"2025-03-22T06:47:06.192Z","etag":null,"topics":["tag-non-production"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getsentry.png","metadata":{"funding":{"custom":["https://sentry.io/pricing/","https://sentry.io/"]},"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}},"created_at":"2019-05-31T04:03:07.000Z","updated_at":"2024-07-04T10:47:53.000Z","dependencies_parsed_at":"2023-02-15T03:01:33.266Z","dependency_job_id":null,"html_url":"https://github.com/getsentry/atlas","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fatlas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fatlas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fatlas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fatlas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getsentry","download_url":"https://codeload.github.com/getsentry/atlas/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245049844,"owners_count":20552735,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["tag-non-production"],"created_at":"2025-03-23T03:24:11.114Z","updated_at":"2025-03-23T03:24:11.779Z","avatar_url":"https://github.com/getsentry.png","language":"Python","readme":"# atlas\n\nAtlas is an internal portal, offering a variety of features helping bring visibility within your organization.\n\nIt's built on top of G Suite by Google, and currently features:\n\n- A two-way synced employee directory\n- An automatically generated organization chart\n\nThis project is still in its infancy, and pull requests are absolutely welcome.\n\n## API Keys\n\nYou'll need two sets of credentials from Google:\n\n1. An API key with access to both the Maps JavaScript API and the Geocoding API\n2. An OAuth application configured:\n   - application type is internal\n   - authorized domains should include your domain name (e.g. example.com)\n   - scopes should include email, profile, and openid\n3. A set of credentials should be generated:\n   - origins and redirect uri should both be the root domain (e.g. http://atlas.example.com)\n\n## Development\n\n**Make sure you disable Adblock as it seems to break Google Auth**\n\nYou'll need Postgres and Redis instances running with standard credentials. A basic set of docker services are included and can be run with compose:\n\n```shell\n$ docker-compose up -d\n```\n\nFrom there, activate a virtualenv using Python 3.7.x (this is automatic if you're using `pyenv` and `direnv`), and install the dependencies:\n\n```shell\n$ make\n```\n\nApply database migrations:\n\n```shell\n$ atlas migrate\n```\n\nLastly, grab the Google, and place them in .env. See the included `.env.example` for additional configuration:\n\n```shell\nGOOGLE_CLIENT_SECRET=\nGOOGLE_CLIENT_ID=\nGOOGLE_MAPS_KEY=\n```\n\n## Mock Data\n\nYou can load some example mock data with a basic organization structure by running the following command:\n\n```shell\n$ atlas load_mocks\n```\n\nNote: If you run this multiple times you will end up with multiple similar profiles, as they're not unique.\n\n## Syncing People\n\n**You will need an account with domain permission to sync data**\n\nOnce you've authenticated with your Google Auth, you can sync the directory with the following command:\n\n```shell\n$ atlas sync_google\n```\n\n## Services\n\nAtlas is made up of two key services.\n\nThe **backend** service is a Django application exporting a graphql API. It runs on top of a Postgres database and is completely stateless.\n\nThe **frontend** service is a SPA built on React implementing the majority of user interactions as well as authentication.\n\nThese services can be run easily in local development using the included proxy with the following:\n\n```shell\n$ npm start\n```\n\nFrom there you can access the UI at http://localhost:8080. This will expose the backend at `/graphql/` and the UI at `/`.\n\n### Backend\n\nThe backend is a GraphQL implementation powered by Graphene. The exposed endpoint is `/graphql/`.\n\nTo launch the backend service (from within your virtualenv) run the following:\n\n```shell\n$ atlas runserver\n```\n\n### Offline Workers\n\nOffline workers are bundled with the backend application, and run by Celery.\n\nTo launch the workers service (from within your virtualenv) run the following:\n\n```shell\n$ atlas worker\n```\n\n### Frontend\n\nThe frontend service is built on top of React as a Single Page Application (SPA). It contains all user interface logic as well as various business flows.\n\nTo launch the frontend service run the following:\n\n```shell\n$ cd frontend \u0026\u0026 npm start\n```\n\n## Authentication\n\nAuthentication is done via the following:\n\n1. Perform a login mutation:\n\n```graphql\nmutation {\n  login(email: \"foo@example.com\", password: \"bar\") {\n    errors\n    ok\n    token\n    user {\n      id\n      email\n      name\n    }\n  }\n}\n```\n\n2. Capture the token in the response and send it with future requests:\n\n```http\nAuthorization: Token {value}\n```\n\nHere's a helpful app which lets you bind an auth header:\n\nhttps://github.com/skevy/graphiql-app\n\nNote: You can also use the included helper to generate an auth token:\n\n```shell\n$ atlas generate_auth_token [email address]\n```\n\n## Repository Layout\n\n```\natlas\n├── backend\n|   ├── atlas               // django backend service\n|   |   ├── models          // database schema\n|   |   ├── mutations       // registered mutations\n|   |   └── queries         // registered queries\n└── frontend\n    └── src\n        ├── actions             // redux actions\n        ├── components          // standard react components\n        ├── pages               // core routing components\n        └── reducers            // redux reducers\n```\n\n### Data Model\n\n- Most models contain a GUID (UUID) primary key.\n\n```\natlas\n├── Office\n└── User\n    ├── Photo\n    ├── Profile\n    └── Identity\n```\n","funding_links":["https://sentry.io/pricing/","https://sentry.io/"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetsentry%2Fatlas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetsentry%2Fatlas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetsentry%2Fatlas/lists"}