{"id":18006056,"url":"https://github.com/brianhicks/listenup","last_synced_at":"2025-06-12T01:39:27.425Z","repository":{"id":138123161,"uuid":"931703","full_name":"BrianHicks/ListenUP","owner":"BrianHicks","description":null,"archived":false,"fork":false,"pushed_at":"2012-07-10T03:18:41.000Z","size":1040,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-04T18:43:59.976Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BrianHicks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-09-22T20:25:35.000Z","updated_at":"2014-02-04T22:59:29.000Z","dependencies_parsed_at":"2023-03-15T17:31:08.295Z","dependency_job_id":null,"html_url":"https://github.com/BrianHicks/ListenUP","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BrianHicks/ListenUP","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrianHicks%2FListenUP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrianHicks%2FListenUP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrianHicks%2FListenUP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrianHicks%2FListenUP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BrianHicks","download_url":"https://codeload.github.com/BrianHicks/ListenUP/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrianHicks%2FListenUP/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259379086,"owners_count":22848669,"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":[],"created_at":"2024-10-30T00:23:06.737Z","updated_at":"2025-06-12T01:39:27.386Z","avatar_url":"https://github.com/BrianHicks.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ListenUP\n\nListenUP is a SaaS web application to create and manage surveys. It was created\nfor the psychology students at John Brown University to use during a senior\nseminar class on data collection.\n\n## Design Challenges\n\nThe old system for sending surveys would have students crafting an email with\nquestions to send to their intended recipient. These had very low response\nrates, as the non-psych students on campus would be deluged with these emails\nat the end of every semester, along with the subsequent begging for responses.\nThese were solved by letting students write an introduction to their survey,\nand then send it up to three times.\n\n## The Good Parts\n\nHere are some of the best portions of the codebase:\n\n - \"app/controllers/surveys_controller.rb\": Especially `#export`, which\n   downloads a report as a CSV that identifies itself as an excel spreadsheet\n   (a requirement of the department.)\n - \"app/helpers/surveys_helper.rb\": Transforms database records into answerable\n   survey fields.\n\n## Changes I'd make\n\nHere's a list of some changes I'd make, knowing what I know now.\n\n### MongoDB\n\nThe current state of the Survey model (and associated Question, Answer,\nRecipient, and Response models) is a bit messy. I'd reimplement this to use\nMongoDB, as it would be a pretty perfect way to store irregularly shaped\ndocuments. For instance, a Response could look something like this:\n\n    {\n        \"_id\": ObjectID(...),\n        \"survey\": ObjectID(...),\n        \"recipient\": {\"email\": \"email@email.com\", \"id\": ObjectID(...)},\n        \"questions\": {\n            \"How many pencils do you own?\": 5\n        }\n    }\n\n### Smaller changes\n\n - I'd use cancan or something similar to implement permissions - the existing\n   code checks in multiple places and isn't very DRY.\n - Email should be sent asynchronously, especially bulkier mailings like these.\n - Better market research - looking back, it would have been easy to market\n   this as a product to undergraduate psycology programs. They don't have a lot\n   of good options when it comes to software (as of two years ago.)\n - Use a good JS library like Knockout or Ember to create a better\n   user-experience when creating surveys.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrianhicks%2Flistenup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrianhicks%2Flistenup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrianhicks%2Flistenup/lists"}