Skip to content

Commit 28036d5

Browse files
committed
first commit
0 parents  commit 28036d5

File tree

1,113 files changed

+495984
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,113 files changed

+495984
-0
lines changed

.!54909!.DS_Store

Whitespace-only changes.

.!54922!.DS_Store

Whitespace-only changes.

.github/ISSUE_TEMPLATE

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
We use Github to track bugs in Staffjoy. Please answer these questions before submitting your issue. All of our code is in one place, so please preface the title with the system where the bug is (e.g. "company api" or "www"). Thanks!
2+
3+
### What environment did you encounter the issue in?
4+
5+
development, staging, or production? (staffjoy.com is "production")
6+
7+
### Which browser are you using?
8+
9+
(if applicable)
10+
11+
### What did you do?
12+
13+
If possible, provide a recipe for reproducing the error. For web requests that fail, a `CURL` statement is best. Please try to include the request body.
14+
15+
### What did you expect to see?
16+
17+
18+
### What did you see instead?
19+
20+
The response from the server contains information that will help us isolate the issue
21+
22+
### Are there any logs indicating an issue?
23+
24+
In staging and production, Sentry (https://sentry.io) will show error information. Please paste that link here.
25+
26+
In development, check the running pods and look at their logs. (For api errors, look at the "server" version of the application for the error - because the api is just a gateway).
27+
28+
Development logs link: http://kubernetes.staffjoy-v2.local/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/#/pod?namespace=development
29+

.gitignore

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Compiled Object files, Static and Dynamic libs (Shared Objects)
2+
*.o
3+
*.a
4+
*.so
5+
*.swo
6+
7+
# Folders
8+
_obj
9+
_test
10+
11+
# Architecture specific extensions/prefixes
12+
*.[568vq]
13+
[568vq].out
14+
15+
*.cgo1.go
16+
*.cgo2.c
17+
_cgo_defun.c
18+
_cgo_gotypes.go
19+
_cgo_export.*
20+
21+
_testmain.go
22+
23+
*.exe
24+
*.test
25+
*.prof
26+
27+
# ignore bazel bins
28+
bazel-*
29+
30+
# ignore vagrant
31+
.vagrant
32+
33+
# ignore visual studio configuration
34+
.vscode
35+
36+
# Silly macs
37+
.DS_Store
38+
*.swp
39+
40+
# allow local go/glide vendor
41+
vendor
42+
43+
# ignore glide cache
44+
.glide/
45+
46+
# in case you accidentally run npm at this level
47+
npm-debug.log
48+
node_modules/

BUILD

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
load("//tools:build_rules/go.bzl", "go_package_prefix")
4+
5+
go_package_prefix("v2.staffjoy.com/")
6+
7+
filegroup(
8+
name = "nothing",
9+
visibility = ["//visibility:public"],
10+
)

BUILD.ubuntu

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
load("@bazel_tools//tools/build_defs/docker:docker.bzl", "docker_build")
2+
3+
docker_build(
4+
name = "trusty",
5+
tars = [
6+
"trusty/ubuntu-trusty-core-cloudimg-amd64-root.tar.gz",
7+
],
8+
visibility = ["//visibility:public"],
9+
)

CONTRIBUTING.md

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Contributing to Staffjoy
2+
3+
## Community and contact information
4+
5+
- [Pull requests](https://github.com/staffjoy/v2/pulls)
6+
- Support and bug report email: [[email protected]](mailto:[email protected])
7+
8+
## Testing
9+
10+
We run static code analysis wherever possible, including linting and
11+
formatting checks. We also extensively monitor all systems and
12+
staging/production errors.
13+
14+
We believe in strategically testing important logic, but that achieving 100%
15+
coverage is not always worth the time.
16+
17+
## Commit message format
18+
19+
We follow a rough convention for commit messages that is designed to answer two
20+
questions: what changed and why. The subject line should feature the what and
21+
the body of the commit should describe the why.
22+
23+
```
24+
scripts: add the test-cluster command
25+
26+
this uses tmux to setup a test cluster that you can easily kill and
27+
start for debugging.
28+
29+
Fixes #38
30+
```
31+
32+
The format can be described more formally as follows:
33+
34+
```
35+
<subsystem>: <what changed>
36+
<BLANK LINE>
37+
<why this change was made>
38+
<BLANK LINE>
39+
<footer>
40+
```
41+
42+
The first line is the subject and should be no longer than 70 characters, the
43+
second line is always blank, and other lines should be wrapped at 80 characters.
44+
This allows the message to be easier to read on GitHub as well as in various
45+
git tools.

LICENSE

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2015-2017 StaffJoy, Inc.
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# Staffjoy V2
2+
3+
[![Build Status](https://travis-ci.org/Staffjoy/v2.svg?branch=master)](https://travis-ci.org/Staffjoy/v2) [![Moonlight](https://img.shields.io/badge/contractors-1-brightgreen.svg)](https://moonlightwork.com/staffjoy)
4+
5+
[Staffjoy is shutting down](https://blog.staffjoy.com/staffjoy-is-shutting-down-39f7b5d66ef6#.ldsdqb1kp), so we are open-sourcing our code. This the second version of our product, a ground-up rewrite intended for small businesses, like restaurants. You can learn about the design journey from V1 to V2 in [this blog post](https://blog.staffjoy.com/staffjoy-v2-ca15ff1a1169#.e7lmhde6v).
6+
7+
We started building V2 in August 2016, became feature complete in November 2016, and [launched to the press in January 2017](http://venturebeat.com/2017/01/10/staffjoy-raises-1-2-million-to-help-small-businesses-manage-workflow-scheduling/).
8+
9+
This is a *monorepo*, so all of the code for all of the services are in this repo. The core technologies are the [Bazel build system](https://bazel.build/), [Kubernetes](https://kubernetes.io/) (including its DNS for internal service discovery), [Redux](http://redux.js.org/), [Go](https://golang.org/), and [Yarn](https://yarnpkg.com/en/). In staging and production, we used [Google Container Engine](https://cloud.google.com/container-engine/) and their managed databases.
10+
11+
## Credit
12+
13+
The authors of the original code were [@philipithomas](https://github.com/philipithomas), [@samdturner](https://github.com/samdturner), [@andhess](https://github.com/andhess), and some contractors. This is a fork of the internal repository. For security purposes, the Git history has been squashed.
14+
15+
## Services
16+
17+
[Read about the V2 architecture on our blog](https://blog.staffjoy.com/staffjoys-v2-architecture-9d2fcb4015fd#.pggmlbtmw)
18+
19+
[![Staffjoy V2 Architecture](https://blog.staffjoy.com/staffjoys-v2-architecture-9d2fcb4015fd#.pggmlbtmw)](https://blog.staffjoy.com/staffjoys-v2-architecture-9d2fcb4015fd#.pggmlbtmw)
20+
21+
* Faraday proxies all traffic from external services to internal ones. It also tells backend services whether a user is logged in. It's the only service that has a public IP address!
22+
* www (www.staffjoy.com) is the main marketing website. It also handles login and logout.
23+
* myaccount (myaccount.staffjoy.com) is a single-page javascript app that lets users modify their accounts
24+
* account-gateway (account.staffjoy.com) is the externally-available REST api for modifying accounts. It converts REST to gRPC for the accounts-datastore
25+
* accounts-server is the internal system that processes gRPC calls and stores/retrieves information using the account database.
26+
* company-gateway (company.staffjoy.com) is the externally-available REST api for modifying companies. It converts REST to gRPC for the companys-datastore
27+
* company-server is the internal system that processes gRPC calls and stores/retrieves information using the company database.
28+
* whoami (whoami.staffjoy.com) is a website that sends information about the current web session for easy access in the front-end.
29+
* superpowers (superpowers.staffjoy-v2.local) is a development-only website that lets you gain super user powers across Staffjoy (denoted as "support" flag on user accounts)
30+
* ical (ical.staffjoy-v2.local) is service serving up a worker's shift list through ical
31+
32+
### External API Standards
33+
34+
* Services should be RESTful JSON over HTTPS
35+
* Serve the spec at `/swagger.json`
36+
* Use the `apidocs` package to serve a swagger UI at `/ui/`
37+
38+
## Dev
39+
40+
### Getting started
41+
42+
Welcome to Staffjoy!
43+
44+
We use a **monorepo** that stores all of our code in this single repo. We use Vagrant to run a kubernetes cluster locally on your laptop. This makes it easy to run all of Staffjoy's services.
45+
46+
### Setting up your Gopath
47+
48+
If you are running Go code, you should [set up your $GOPATH](https://golang.org/doc/install), then clone this repository into the `v2.staffjoy.com` package:
49+
50+
```
51+
mkdir -p $GOPATH/src/
52+
git clone [email protected]:Staffjoy/staffjoy.git $GOPATH/src/v2.staffjoy.com/
53+
```
54+
55+
### One-time dependencies on host machine (laptop)
56+
57+
* [Virtualbox](https://www.virtualbox.org/)
58+
* [Vagrant](https://www.vagrantup.com/docs/getting-started/), then run `vagrant up` to boot the dev server.
59+
* Vagrant host manager: `vagrant plugin install vagrant-hostmanager`
60+
* unison (see below)
61+
* [modd](https://github.com/cortesi/modd) (either from Go source or binary available [here])
62+
63+
### Installing Unison
64+
65+
Unison syncs files between the host and the VM in a way that preserves simlinks.
66+
67+
Unfortunately, installing it on OSX is a bit of a pain because the version and the compiler must be the same as the one in Vagrant!
68+
69+
First, install OCaml version 3.12 - you may need to say "yes" to some command prompts:
70+
71+
```
72+
wget https://raw.github.com/ocaml/opam/master/shell/opam_installer.sh -O - | sh -s /usr/local/bin 3.12.1
73+
```
74+
75+
Check that `ocaml -version` is 3.12.1. If it is not, try removing `/usr/local/bin/ocaml` and running `opam switch 3.12.1`.
76+
77+
Then, compile unison with this version of ocaml. You may be prompted for your password.
78+
79+
```
80+
cd /tmp
81+
curl -O https://www.seas.upenn.edu/~bcpierce/unison/download/releases/unison-2.40.102/unison-2.40.102.tar.gz
82+
tar -xvzf unison-2.40.102.tar.gz
83+
cd unison-2.40.102
84+
make UISTYLE=text
85+
sudo cp unison /usr/local/bin
86+
```
87+
88+
89+
### Running the Environment
90+
91+
92+
Run `make dev`. Code will boot and run at [staffjoy-v2.local](http://www.staffjoy-v2.local). Note that the first time you do this could take up to 45 minutes in order to provision the VM!
93+
94+
Changes will trigger an automatic rebuild and redeployment. (Check deployment progress at [kubernetes.staffjoy-v2.local/ui/](http://kubernetes.staffjoy-v2.local/ui/)). End the dev server with `control + c` (and it will automatically shut off the VM).
95+
96+
**Known Bug on OSX Sierra**: If Vagrant cannot find download the box, run `sudo rm /opt/vagrant/embedded/bin/curl`. ([Bug tracking link](https://github.com/Varying-Vagrant-Vagrants/VVV/issues/354))
97+
98+
If you run into issues with stuck deployments in development - then run `make dev-k8s-fix` then re-run `make dev`.
99+
100+
### Accessing the environment
101+
102+
Access the VM by running `vagrant ssh`. Code is located in `/home/vagrant/golang/src/v2.staffjoy.com/` (aliased to `$STAFFJOY`, i.e. `cd $STAFFJOY`).
103+
104+
To build code and run it locally, in vagrant go to the code directory `$STAFFJOY` in vagrant, then run `make dev-build` for a one-time build.
105+
106+
If things are really goofing, run `vagrant destroy -f` then rebuild.
107+
108+
## Debugging
109+
110+
* There is a **known bug** where kubernetes does not come back after vagrant halts. To identify this, ssh into vagrant (`vagrant ssh`), then examine running docker containers (`docker ps`). If it's not running dozens of contianers, there's a problem. **To fix this:**, run `make dev-k8s-fix`. (Your local data may be wiped out).
111+
* If files are not syncing between your laptop and vagrant (to Vagrant's `$STAFFJOY` directory) - try running `make dev` again, or manually running unison (the syncer) on the host machine with `./vagrant/unison.sh`.
112+
* If your machine can't keep up with autobuilding on changes, it may be preferred to stop using `make dev` and to instead call its two subcommands separately (manually): `./vagrant/unison.sh` to sync files on your computer, then SSHing into Vagrant and manually triggering builds (`cd $STAFFJOY && make dev-build`)
113+
114+
### Development resources
115+
116+
* [Kubernetes UI](http://kubernetes.staffjoy-v2.local/ui/). We use the `development` namespace. You can see logs from a "pod" (container) through the UI ([link](http://kubernetes.staffjoy-v2.local/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/#/pod?namespace=development))
117+
* [HTTP Debugger (for faraday)](http://faraday.staffjoy-v2.local/) - use this to examine headers being sent to internal systems
118+
* [Superpowers lets you do magic things](http://superpowers.staffjoy-v2.local) - use it while logged in to get `support` api permissions in dev.
119+
120+
## Go
121+
122+
### Assets in Go
123+
124+
If you are loading assets like templates, CSS, JS, etc - you need to package the the data into the binary. Otherwise, the app will ship and it won't be able to find the assets!
125+
126+
To do this, use the [go-bindata](https://github.com/jteeuwen/go-bindata) project. If you modify any of the asset files, you will need to rebuild them then commit the resulting `bindata.go` file and commit it. You have been warned!
127+
128+
Most services provide a `build.sh` file that compiles all the data that needs to be committed.
129+
130+
### Development tools
131+
132+
The tool [GoConvey](https://github.com/smartystreets/goconvey) is great for seeing tests.
133+
134+
### Environment variables for configuration
135+
136+
* `ENV`: Set to `development`,`staging`, or `production`. Null defaults to `development`
137+
* `SENTRY_DSN`: Set to the [Sentry](https://getsentry.com) api key in every Go service for proper error tracking and reporting
138+
139+
## Protocol Buffers
140+
141+
If you modify the files in `protobuf/`, run `make protobuf` to recompile all of the generated files.
142+
143+
If you're getting started with protocol buffers, here are some resources:
144+
145+
* [Protocol Buffers](https://developers.google.com/protocol-buffers/)
146+
* [gRPC](http://grpc.io)
147+
* [gRPC health checks](https://github.com/grpc/grpc/blob/master/doc/health-checking.md)
148+
149+
## Working Offline
150+
151+
* Email will break, but you can look at the system logs for the email service to see what would have been sent. (Useful for grabbing account activation links!)
152+
* See all Go documentation installed on the host machie with `godoc -http=":8080"`. You'll be able to see all docs at [localhost:8080](http://localhost:8080/)

Vagrantfile

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# -*- mode: ruby -*-
2+
# vi: set ft=ruby :
3+
4+
ip = '192.168.33.11'
5+
cpus = 2
6+
memory = 1024 * 6
7+
8+
def fail_with_message(msg)
9+
fail Vagrant::Errors::VagrantError.new, msg
10+
end
11+
12+
13+
Vagrant.configure(2) do |config|
14+
config.vm.box = "ubuntu/trusty64"
15+
config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
16+
config.vm.network :private_network, ip: ip, hostsupdater: 'skip'
17+
config.vm.hostname = 'staffjoy-v2.local'
18+
19+
config.vm.provider 'virtualbox' do |vb|
20+
vb.name = config.vm.hostname
21+
vb.customize ['modifyvm', :id, '--cpus', cpus]
22+
vb.customize ['modifyvm', :id, '--memory', memory]
23+
24+
# Fix for slow external network connections
25+
vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
26+
vb.customize ['modifyvm', :id, '--natdnsproxy1', 'on']
27+
end
28+
29+
if Vagrant.has_plugin? 'vagrant-hostmanager'
30+
config.hostmanager.enabled = true
31+
config.hostmanager.manage_host = true
32+
config.hostmanager.aliases = [
33+
'account.staffjoy-v2.local',
34+
'app.staffjoy-v2.local',
35+
'company.staffjoy-v2.local',
36+
'faraday.staffjoy-v2.local',
37+
'kubernetes.staffjoy-v2.local',
38+
'myaccount.staffjoy-v2.local',
39+
'superpowers.staffjoy-v2.local',
40+
'signal.staffjoy-v2.local',
41+
'waitlist.staffjoy-v2.local',
42+
'whoami.staffjoy-v2.local',
43+
'www.staffjoy-v2.local',
44+
'ical.staffjoy-v2.local',
45+
]
46+
else
47+
fail_with_message "vagrant-hostmanager missing, please install the plugin with this command:\nvagrant plugin install vagrant-hostmanager"
48+
end
49+
config.vm.provision "shell", path: "vagrant/provision.sh"
50+
end

0 commit comments

Comments
 (0)