{"id":13507357,"url":"https://github.com/bharani91/ex-shop","last_synced_at":"2025-03-30T08:30:30.043Z","repository":{"id":144877909,"uuid":"68797598","full_name":"bharani91/ex-shop","owner":"bharani91","description":"Digital goods shop \u0026 blog created using Elixir (Phoenix framework)","archived":false,"fork":false,"pushed_at":"2016-10-04T05:25:37.000Z","size":1068,"stargazers_count":219,"open_issues_count":2,"forks_count":24,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-08-01T02:11:13.028Z","etag":null,"topics":["blog","elixir","phoenix","shop","webpack"],"latest_commit_sha":null,"homepage":"https://www.authenticpixels.com","language":"Elixir","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/bharani91.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-09-21T08:42:40.000Z","updated_at":"2024-08-01T02:11:13.029Z","dependencies_parsed_at":"2024-01-07T21:54:32.940Z","dependency_job_id":null,"html_url":"https://github.com/bharani91/ex-shop","commit_stats":null,"previous_names":["authentic-pixels/ex-shop"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bharani91%2Fex-shop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bharani91%2Fex-shop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bharani91%2Fex-shop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bharani91%2Fex-shop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bharani91","download_url":"https://codeload.github.com/bharani91/ex-shop/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246296325,"owners_count":20754623,"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":["blog","elixir","phoenix","shop","webpack"],"created_at":"2024-08-01T02:00:32.023Z","updated_at":"2025-03-30T08:30:28.772Z","avatar_url":"https://github.com/bharani91.png","language":"Elixir","funding_links":[],"categories":["Applications"],"sub_categories":[],"readme":"# Authentic Pixels\n\n**Digital goods shop \u0026 blog created using Phoenix Framework (Elixir)**\n\nThis is the source code for my new website - [Authentic Pixels](https://www.authenticpixels.com).\nThrough Authentic Pixels, I plan to deliver high quality free \u0026 premium web resources including Bootstrap HTML templates, startup landing pages, UI kits, mockups \u0026 themes for Ghost \u0026 Wordpress.\n\n-----\n\n## Demo \u0026 Screenshots\n\n**View the live website here - [Authentic Pixels](https://www.authenticpixels.com)**\n\nHere are some screenshots of the admin area.\n\n![Authentic Pixels - Product Editor](/web/static/assets/images/promo/admin-1.jpg)\n\n![Authentic Pixels - Dashboard](/web/static/assets/images/promo/admin-2.jpg)\n-----\n\nThis project has been a great learning experience for me. Coming from Ruby on Rails, there are a lot of things that are done differently in Elixir/Phoenix and building this app has helped me understand the \"Elixir way\" of doing things.\n\nSome of the things that this project helped me wrap my head around are -\n\n1. Nested records \u0026 associations (e.g: Product has many variants)\n2. Handling many-to-many associations and validating them\n3. Uploading images\n4. Testing\n5. Switching to Webpack from Brunch\n6. Creating Sitemaps and running a cron task to regularly run the sitemap generation task\n7. Deploying (to a Digital Ocean box using Dokku)\n8. Sending HTML emails.\n9. Separating admin area from frontend using differnt layouts and scopes in `router.ex`\n\nI will be writing about this is a lot more detail on [my blog](https://www.authenticpixels.com) soon.\n\n\n\n-----------\n\n## Installation\n\n1. Clone the repository and install the dependencies\n```\ngit clone git@github.com:authentic-pixels/exshop.git\ncd exshop\nmix deps.get\nnpm install\n```\n\n2. Create the database and run the migrations\n```\nmix ecto.create\nmix ecto.migrate\n```\n\n4. Create an admin user. You can change the email and password in `priv/repo/seeds.exs` file.\n```\nmix run priv/repo/seeds.exs\n```\n\n5. Add your Cloudinary keys. Create a file called `dev.secret.exs` inside `config` folder with the following contents. Be sure to change the 'name', 'api_key' and 'api_secret' fields.\n```\nuse Mix.Config\nconfig :cloudini,\n  api_key: \"CHANGE_ME\",\n  api_secret: \"CHANGE_ME\",\n  name: \"CHANGE_ME\",\n  stub_requests: false,\n  http_options: [timeout: 15000]\n```\n\n5. Start the server\n```\niex -S mix phoenix.server\n```\nNow visit http://localhost:4000/ to see the frontend version. To access the admin area, visit http://localhost:4000/admin. You can login with the email and password set in `priv/repo/seeds.exs`.\n\n\n------\n\n## Running tests\n\n1. Set up your test database\n```\nMIX_ENV=test mix ecto.reset\n```\n\n2. Run all the tests on file change\n```\nmix test.watch\n```\n\n-----------\n\n## Todo\n\n- [x] Create sitemaps\n- [x] Cron task to update sitemaps frequently\n- [ ] Add archives page to blog\n- [ ] Create RSS feeds\n- [ ] Explore Google AMP versions for product/post pages\n- [ ] Write integration tests for admin area\n\n\n--------\n\n\n## Credits\n\nThe Elixir/Phoenix community is really welcoming \u0026 responsive. There are tons of nice examples and packages that helped me with my learning. Here are some of the elixir packages that I am using in this project -\n\n- **Comeonin** for password hashing\n- **test.watch** for running tests\n- **Bamboo** for sending emails\n- **Cloudini** for uploading images to Cloudinary\n- **Quantum** for running cron tasks\n- **Curtail** for truncating HTML snippets\n- **XML builder** for generating Sitemaps\n- **Kerosene** for pagination\n\n\n--------\n\n\nFor any questions/comments/suggestions, drop me a line at - [bharani@authenticpixels.com](mailto:bharani@authenticpixels.com) or send me a [tweet](https://twitter.com/bharani91).\n\nThanks,\n\nBharani,\n**[Authentic Pixels - Free \u0026 Premium Web Resources](https://www.authenticpixels.com)**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbharani91%2Fex-shop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbharani91%2Fex-shop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbharani91%2Fex-shop/lists"}