Skip to content

Instantly share code, notes, and snippets.

View ryantbrown's full-sized avatar

Ryan Brown ryantbrown

View GitHub Profile
@ryantbrown
ryantbrown / with-pg-error-handling.ts
Last active May 9, 2025 18:01
TypeScript Postgres Error Handling
import { DatabaseError } from "pg";
import { DatabaseErrorCode } from "./errors";
/**
* Higher order function with fine-grained error handling.
*/
export async function withErrorHandling<T>(
fn: () => Promise<T>,
onError: Record<string, (error: PgDatabaseError) => void>,
) {
@ryantbrown
ryantbrown / typescript-postgres-error-codes.ts
Created May 9, 2025 17:57
TypeScript object of PostgreSQL error codes
/**
* Database (PostgreSQL) error codes.
*/
export const DatabaseErrorCode = {
SuccessfulCompletion: "00000",
Warning: "01000",
DynamicResultSetsReturned: "0100C",
ImplicitZeroBitPadding: "01008",
NullValueEliminatedInSetFunction: "01003",
PrivilegeNotGranted: "01007",
@ryantbrown
ryantbrown / es-nested-agg-nested-query.json
Last active February 27, 2018 19:39
Elastic search nested aggregate with nested query
GET influencers/_search
{
"size": 0,
"aggregations": {
"influencers": {
"nested": {
"path": "interests"
},
"aggs": {
"names": {
@ryantbrown
ryantbrown / composer.json
Created February 21, 2018 17:18
Private composer package
// main app
"repositories" : [
{
"type": "package",
"package": {
"name": "grininc/platform-shared",
"version": "dev-master",
"source": {
"url": "git://github.com/grininc/platform-shared.git",
"type": "git",
@ryantbrown
ryantbrown / s3upload.sh
Created February 1, 2018 07:25
Bash script to Upload folder to S3
# Set AWS credentials and S3 paramters
AWS_KEY=""
AWS_SECRET=""
S3_BUCKET=""
S3_BUCKET_PATH="/"
S3_ACL="x-amz-acl:private"
function s3Upload
{
path=$1
@ryantbrown
ryantbrown / click-outside-element.js
Last active April 30, 2018 08:56
Handle a click outside of a parent element
// the parent, avoid clicks inside this element
const parent = document.getElementById('parent');
window.addEventListener('click', e => {
let elem = e.target;
// loop through the target's parent nodes to see if it matches
for ( ; elem && elem !== document; elem = elem.parentNode ) {
@ryantbrown
ryantbrown / checkbox.css
Last active August 14, 2018 10:04
SVG based checkbox
.checkbox {
height: 40px;
width: 40px;
outline: none;
cursor: default;
border: 0;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
@ryantbrown
ryantbrown / time-elapsed.php
Last active April 30, 2018 08:56
Get days, hours and minutes that have passed from a given date
<?php
// get interval
// format of $datetime is "Y-m-d H:i:s"
$interval = (new \DateTime("now"))->diff(new \DateTime($datetime));
// get specific times
list($days, $hours, $minutes) = explode(" ", $interval->format("%d %h %i"));
@ryantbrown
ryantbrown / Dockerfile
Created March 22, 2016 05:09
PHP Dockerfile
FROM php:5.6-fpm
RUN apt-get update && apt-get install -y git curl
RUN docker-php-ext-install -j$(nproc) pdo_mysql
RUN docker-php-ext-install -j$(nproc) mbstring
RUN docker-php-ext-install -j$(nproc) tokenizer
RUN curl -sS "https://getcomposer.org/installer" | php
RUN chmod a+x composer.phar && mv composer.phar /usr/local/bin/composer
@ryantbrown
ryantbrown / auto-validation-semantic-ui.js
Created April 16, 2015 21:51
Semantic UI - Auto Validation via Data Attrs
// form validation loaded from config
$('.ui.form').each(function(index){
var config = $(this).data('config');
if(config !== undefined) {
$(this).prepend('<div class="ui icon error message" id="form-errors"></div>');
var settings = APP.config.validation;
config.split('.').forEach(function(el, i, arr){