interview

package module
v0.0.0-...-2e6a434 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 19, 2022 License: BSD-3-Clause Imports: 10 Imported by: 0

README

www.betterinterview.club makes it easy to manage interviews.

Workflow

  1. I create a new organization for my company by signing up with justin@betterinterviews.com.
  2. I invite the first hiring manager: max@betterinterviews.com.
  3. Max receives a registration link in her email. Clicking it brings her to the organization overview page.
  4. Max is hiring for a Staff Software Engineer role at our company. She clicks Open a new role.
  5. She picks 5 yes or no questions that she wants her interviewers to answer after interviewing the candidate.
  6. She types in the emmails of the two interviewers to request their feedback: kit@betterinterviews.com and thea@betterinterviews.com.
  7. Kit and Thea receive an email requesting their feedback. Clicking the link brings them to the Give Feedback page.
  8. On the Give Feedback page, they simply select Yes or No for each question.
  9. After feedback is received, Max, the person who opened the role, receives an email linking her to the Feedback Given page, where she can see the feedback.
  10. Once feedback is complete, Max closes the role.

TODO

Features

  • Send email after invite.
  • Send email to request feedback.
  • Log in from home page.
  • Log out.
  • Send email to creator after feedback received.
  • Close a role once feedback is complete.
  • Send all emails async (don't wait to render page)
  • Submit yes/no to recommend candidate.
  • Open role and request feedback separately.
  • Section for managers, "My Open Roles"
  • Section for interviewers, "My Requested Feedback"
  • Explain feedback answers
  • Section for interviewers, "My Given Feedback"
  • Section for managers, "My Closed Roles"
  • Section for Admins, "All Open Roles"

Marketing

  • Add explanation to landing page
    • What problem am I solving?
    • Why would someone want to use this tool?
    • Why only yes/no questions?
    • Why the additional recommend yes/no?
  • Favicon

Technical

  • Gzip responses
  • Use correct time zones instead of UTC.
  • Minify responses
  • Persist data locally
  • Persist data in production
  • HTML Lang attribute for accessibility
  • Content Security Policy
  • Reusable components
  • Ensure one data query / lock per endpoint
  • Load templates on application startup

Security

  • Block common domains (gmail, yahoo, etc.)
  • Can't send emails to other domains
  • Rate limit email sends
  • Do not allow double feedback responses.

Live Screenshot

Screenshot

Workflow

1. Sign Up with your email

betterinterviews1

2 Head over to your email

betterinterviews2

betterinterviews3

4. Open a new role

betterinterviews4

5. Choose your interview signals

betterinterviews5

6. Request Feedback

betterinterviews6

7. Enter the candidate name and interviewer emails

betterinterviews7

8. Interviewers receive feedback requests

betterinterviews8

9. Interviewers answer questions

betterinterviews9

10. Hiring manager receives feedback via email

betterinterviews10

11. Feedback is also viewable on the website

betterinterviews11

12. Close the role once you make a hire!

betterinterviews12

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultOrganizations = &Organizations{}
View Source
var ErrCrossDomainEmail = errors.New("cannot send cross-domain emails")
View Source
var ErrOrgNotFound = errors.New("organization not found")
View Source
var ErrUserNotFound = errors.New("user not found")

Functions

func Email

func Email(opts EmailOptions, org Organization) error

Types

type Answer

type Answer struct {
	ID          uuid.UUID
	QuestionID  uuid.UUID
	Response    bool
	Explanation string
}

func NewAnswer

func NewAnswer(questionID string, response bool, explanation string) (Answer, error)

type EmailOptions

type EmailOptions struct {
	To      string
	Subject string
	HTML    string
	From    string
}

type Feedback

type Feedback struct {
	ID          uuid.UUID
	CreatorID   uuid.UUID
	CreatedAt   time.Time
	Team        string
	Role        string
	Questions   []Question
	Requests    []FeedbackRequest
	Closed      bool
	CloseReason string
}

func NewFeedback

func NewFeedback(creatorID uuid.UUID, team, role string, questions []Question) (Feedback, error)

func (*Feedback) QuestionByID

func (f *Feedback) QuestionByID(id string) (Question, error)

type FeedbackRequest

type FeedbackRequest struct {
	ID                   uuid.UUID
	CreatedAt            time.Time
	CandidateName        string
	InterviewerEmails    []string
	Responses            []FeedbackResponse
	ExplanationsRequired bool
}

func NewFeedbackRequest

func NewFeedbackRequest(candidate string, explanationsRequired bool, emails ...string) (FeedbackRequest, error)

type FeedbackResponse

type FeedbackResponse struct {
	ID        uuid.UUID
	CreatorID uuid.UUID
	CreatedAt time.Time
	Answers   []Answer
	Recommend bool
}

func NewFeedbackResponse

func NewFeedbackResponse(creatorID uuid.UUID, answers []Answer, recommend bool) (FeedbackResponse, error)

type Organization

type Organization struct {
	ID       uuid.UUID
	Domain   string
	Users    []User
	Feedback []Feedback
}

Test

func NewOrganization

func NewOrganization(domain string) (Organization, error)

func (Organization) FeedbackByID

func (o Organization) FeedbackByID(id uuid.UUID) (Feedback, error)

func (Organization) FeedbackByRequestID

func (o Organization) FeedbackByRequestID(id uuid.UUID) (Feedback, FeedbackRequest, error)

func (*Organization) FindUserByEmail

func (org *Organization) FindUserByEmail(email string) (User, error)

func (*Organization) FindUserByID

func (org *Organization) FindUserByID(id string) (User, error)

func (*Organization) IsDifferentDomain

func (org *Organization) IsDifferentDomain(email string) (bool, error)

type Organizations

type Organizations struct {
	ByDomain map[string]Organization
	Mutex    sync.Mutex `json:"-"`
}

func (*Organizations) Add

func (orgs *Organizations) Add(org Organization) error

func (*Organizations) AddEmailLoginCallback

func (orgs *Organizations) AddEmailLoginCallback(org Organization, u User) (string, error)

func (*Organizations) AddFeedback

func (orgs *Organizations) AddFeedback(org Organization, f Feedback) error

func (*Organizations) AddFeedbackRequest

func (orgs *Organizations) AddFeedbackRequest(org Organization, f Feedback, request FeedbackRequest) error

func (*Organizations) AddFeedbackResponse

func (orgs *Organizations) AddFeedbackResponse(org Organization, request FeedbackRequest, response FeedbackResponse) error

func (*Organizations) AddUser

func (orgs *Organizations) AddUser(org Organization, u User) (Organization, error)

func (*Organizations) FindByDomain

func (orgs *Organizations) FindByDomain(email string) (Organization, error)

func (*Organizations) FindByUserEmail

func (orgs *Organizations) FindByUserEmail(email string) (Organization, error)

func (*Organizations) FindByUserID

func (orgs *Organizations) FindByUserID(id string) (Organization, User, error)

func (*Organizations) FindEmailLoginCallback

func (orgs *Organizations) FindEmailLoginCallback(id string) (User, error)

func (*Organizations) FindOrCreateByEmail

func (orgs *Organizations) FindOrCreateByEmail(email string) (Organization, User, error)

func (*Organizations) Get

func (orgs *Organizations) Get(domain string) (Organization, error)

func (*Organizations) SetFeedback

func (orgs *Organizations) SetFeedback(org Organization, f Feedback) error

type Question

type Question struct {
	ID   uuid.UUID
	Text string
}

func NewQuestion

func NewQuestion(text string) (Question, error)

type User

type User struct {
	ID    uuid.UUID
	Email string
	// CallbackID is the authentication ID for a user to log in with
	CallbackID uuid.UUID
}

func NewUser

func NewUser(email string) (User, error)

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL