Giter Site home page Giter Site logo

golang-cafe / job-board Goto Github PK

View Code? Open in Web Editor NEW
208.0 7.0 50.0 53.18 MB

Golang Cafe - Go job board with no recruiters and clear salary ranges

Home Page: https://golang.cafe

License: BSD 3-Clause "New" or "Revised" License

Go 28.78% HTML 71.14% Shell 0.08%
go golang gojobs golangjobs jobboard golangcafe

job-board's Introduction

Job Board

This is the first Go job board with no recruiters & clear salary ranges.

  • Clear salary range in each job description
  • No third party recruiters (apply directly to companies)
  • All jobs are manually vetted and reviewed
  • Browse salary trends by region
  • Browse companies hiring Go engineers and using Go in production
  • Browse Go developers
  • Weekly Job Newsletter Digest
  • Open Source
  • Filter by minimum Salary
  • The site home page weights under 250kb (188kb uncompressed)

Tech Stack

Local Development Mode - Setup Guide

It's possible to setup a blank instance of this job board locally. This is a local development mode and it's different from the way the app runs in production. In this scenario the app runs on a minimal database containing mock data. The app has reduced functionality when ran in local development mode. It's not possible to send emails or connect to third party services, like Twitter, Telegram and FX APIs. It's still possible to run and test the app but with limited functionality.

Requirements

These are basic requirements with the respective versions have been tested to work locally on MacOS. The same should apply both on Linux and WSL/Windows.

  • Bash 3.2.x or higher
  • Docker 20.10.x or higher
  • Go 1.15.x or higher

Dependencies

  • PostgreSQL instance mocked using local Docker container, with local schema and fixtures
  • Sparkpost Mail emails are sent using http requests through Sparkpost APIs. This is not enabled in local development mode.
  • Telegram API telegram updates are sent through the Job Board official Telegram channel. This is not enabled in local development mode.
  • Twitter API twitter updates are sent through the Job Board official page. This is not enabled in local development mode.
  • FX API a minimal set of Foreign Currency Exchange data is kept up-to-date to filter out salary ranges. This is not enabled in local development mode.

Setup Guide

The only thing that needs to be setup in order for the app to run is the PostgreSQL database instance. Please run the following command in order to setup your local database instance.

./setup-database.sh

Once this command is successful you can now start the application

./run-local-webserver.sh

Test Cron-Jobs Locally

There are a few cron-jobs that are triggered on a schedule, these are scheduled externally via custom http calls to the website. You can see all available cron-jobs by searching for all routes that start with /x/task/.

In order to test a cron-job you can just make the following http request

curl -v -H 'x-machine-token: <machine-token>' -X POST http://localhost:9876/x/task/<task-name>

You can find the under your local environment variable configuration, in the MACHINE_TOKEN environment variable.

Telegram Group OSS discussions

https://t.me/+VloraT7W9yA1YTI8

Feedback?

Feel free to open an issue on GitHub

License

This source code is licensed under BSD 3-Clause License

job-board's People

Contributors

agarella avatar dependabot[bot] avatar diego9182 avatar dsantos avatar ferueda avatar jemiluv8 avatar mahmoudfarouq avatar rabingaire avatar ranjithrosan17 avatar rjackson avatar sandrojijavadze avatar segunajibola avatar sumanau7 avatar thecalcc avatar vasanth-korada avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

job-board's Issues

[FEATURE] add ability to upload CV for developer profile

developers should be able to upload CV after signing up

  • update front-end code HTML/JS uploading CV (edit-developer-profile.html)
  • new bytea field representing the CV file (schema and repo)
  • update Go endpoint to process and validate the new field
  • add ability to update CV from developer profile or upload new one if none present (add "CV not uploaded" if not present)
  • add ability to view/download CV (logged users only - recruiters/admin users only)
  • track when CV has been downloaded (create new table (id, developer_profile_id, cv (bytea), user_id, downloaded_at)
  • local testing
  • make linkedin url optional on sign up and remove linkedin/github links (add only CV)
  • any questions https://t.me/+VloraT7W9yA1YTI8

display newsletter subscribers count

Right now we have a few newsletter boxes but we don't show how many subscribers are currently active. This is straightforward to do as we have this information in the database in the email_subscribers table. So it will be easy to add the dynamic value on the various newsletter boxes and post a job page like below for example

CleanShot 2022-02-12 at 19 23 45@2x

[DX] add basic unit test suite

once #12 is complete, it will be a tad easier to add some basic unit test for handlers and/or repo. we might need to decouple logic form server.go a bit more before being able to mock all dependencies and write some tests. at least a good place to start would be the handler functions

[FEATURE] implement dark mode

styles are inlined/internal only. To keep latency low and avoid any render blocking resource, we might need to keep using internal css, but there is a way to re-use and import common css by using Go nested templates.

This can be achieved easily as follows:

common-css.html

{{ define "common-css" }}
<style type="text/css">
// common css code here ...
</style>
{{ end }}

landing.html

<head:>
...
{{ template "common-css" }}
</head>
...

Please see discussions and issues

Selecting text closes a job posting

If I expand a job posting on the home page and select some text from it, the detailed text collapses again.

This also happens when you click just outside of the "link" or "Apply" buttons, by the way. In general, I find the entire UX of "click anywhere in the text for an action" a bit confusing to be honest.

Firefox 70 on Linux

unable to load config: SITE_LOGO_IMAGE_ID cannot be empty

I cloned the repo and ran setup-database.sh script and then run-local-webserver.sh script but I'm getting unable to load config: SITE_LOGO_IMAGE_ID cannot be empty error every time I run it

Is there something that I need to set before the first run? I followed the setup guide which mentions only the above 2 steps

[DX] add more fixtures for test database

right now there are just 2 jobs 1 company and 1 developer. would be good to have much more data to test with locally. It's simple to just add new rows into the latest-fixtures.sql

Collapsing the job ads is extremely disorientating

Scrolling down and then closing a job posting is actually really disorientating; let's say my view looks like this:

  1. Job ad
^ 2. Job ad
| 3. Job ad
|    Expanded text ..
|    Expanded text ..
v    Expanded text ..
     Expanded text ..
     Expanded text ..
  4. Job ad
  5. Job ad
  6. Job ad
  7. Job ad
  8. Job ad
  9. Job ad

The thing on the left represents scrollbar and my browser's viewport. I scrolled down to "job ad 3" and am reading the description. I scroll down and decide I don't want it so collapse it, and now I have:

  1. Job ad
  2. Job ad
  3. Job ad
  4. Job ad
^ 5. Job ad
| 6. Job ad
| 7. Job ad
| 8. Job ad
v 9. Job ad

And I completely missed job posting 4. In reality, it's often more than just one listing. I'm having a real hard time to continue from where I left off.

Firefox 70 on Linux

[FEATURE] allow developers to save jobs and display saved jobs

Candidates should be able to save one or more jobs and be able to display them in a custom page. This should only be possible for logged in developers/users.

  • show 'save jobs' button on each job listing (landing.html, company.html, job.html)
  • the 'save job' button should show banner with 'log in or sign up to save job' which prompts the user to register
  • create new table named developer_jobs_bookmark with developer_id, job_id, saved_at, applied_at
  • implement new save endpoint (saved_at=now, applied_at=null)
  • implement new logic in the apply endpoint where user is logged in it should save the job and mark as applied (saved_at=apploed_at=now)
  • add page where developer can see saved jobs and applied jobs
  • when retrieving applied jobs should also join apply_token table (get all jobs when email matches developer email)
  • any questions https://t.me/+VloraT7W9yA1YTI8

[FEATURE] introduce repository cache

right now the caching is done on the handlers/server layer. As a better testable and cleaner approach there should be a cached repository that sits in front of the database repository. This once the #12 is complete.

So there would be

before

handler (cache retrieved from memory) -> database repository

after

handler -> cached repository (retrieve from in memory cache) -> database repository

[DX] dockerize Go app into Dockerfile for testing (Dockerfile.local) and production (Dockerfile)

Right now the Go server runs without Docker. The app is deployed on Digital Ocean App Platform which allows both Go and Docker as well as many other runtimes. To make the project portable and to make it easier to run it locally, it would be beneficial to Dockerize the app. We should have a prod and a test/local Dockerfile.

Here is an example of Dockerfile from DigitalOcean https://github.com/digitalocean/sample-dockerfile/blob/main/Dockerfile

add local setup guide

add a local setup guide so that people can spin up their postgres instance and local golang cafe instance for testing

[FEATURE] add percentile information for job ad compensation

it would be nice to understand how a certain job ad compensation stands compared to other jobs for the same location. For example if a job in germany pays 80-100/year. This info would be presented as "This salary range is higher than 90% of jobs for the same location" (90th percentile). Percentile information is readily available already https://golang.cafe/Golang-Developer-Salary-Germany and we could expand the brackets to include more bands (not only 10,50,90 percentile) but more (10,20,30,40,50,60,70,80,90,95,99). Minimal UI change is required in job advert page and on each job preview in the home page.

[FEATURE] allow developers to specify experience and education

now developers upon signing up specify their location and some other basic info such as bio and skills. There should be an option to be able to specify a section with experience and education after sign up

  • enable developer to input experience, education and github projects (title, description, link) after sign up only
  • display experience and education, github projects in the public developer page
  • create new table developer_metadata (developer_profile_id, type(education|experience|github), title, description, link(optional)
  • fixtures and schema
  • endpoint changes
  • HTML/CSS/JS

move blog posts to database

in order to create blogpost now it's only possible to add static files to static/blog directory and write all the html/css each time. It should be possible to move blogposts to database and have a single html file as a template which is rendered via Markdown.

[FEATURE] explain how salary filter works

When filtering for minimum salary on Golang Cafe we only filter by USD. However in the site there are job adverts with many different currencies. Currently we keep a Foreign Exchange table with the most recent FX rates and use this to filter out jobs that are below the given USD threshold and their respective equivalent in all other currencies for each job advert.

Maybe we could add a tooltip on click or mouse over where it explains that job adverts with different currency than USD are converted to their equivalent using the latest exchange rate

CleanShot 2022-02-12 at 19 19 36@2x

Redirect legacy search pages to canonical

Currently the search page format is as follows:

golang.cafe/Golang-{tag}-Jobs-In-{location}

Where tag can either be a skill (DevOps, SysAdmin, Backend) or a company name (Google, Apple)

There are some legacy pages which used to use query string instead of this canonical format. Here's the legacy format

golang.cafe/?l={location}&t={tag}

The above should emit a 301 translating the request URI into the new canonical format.

Eg. golang.cafe/?l=London&t=DevOps should redirect to golang.cafe/Golang-DevOps-Jobs-In-London

Current handler is here https://github.com/golang-cafe/golang.cafe/blob/3c02ac4/pkg/handler/std_handler.go#L19-L27

Use a custom External ID instead of obfuscating Job ID

To avoid enumeration and hide sequential job IDs generated in PostgreSQL we currently use pkg/obfuscator which is a xor-shift on the original job ID, generating every time a different integer to represent a ephemeral external ID.
This is total nonsense and a non-sequential ID should be used.
Probably to have a external_id column in the jobs table which is a ksuid.

[FEATURE] improve skills tagging in developer profile

Right now we allow free-text skills when signing up/edit developers. The main issue is that some times people add broken fields or fields that do not exist. I have some improvements in mind

  • improve javascript and backend validation when signing up and editing profile
    • we currently do strings.Split(skillFreeText, ",") but we should cleanup empty strings eg. "Devops, golang,," -> [devops, golang, ""]
  • make skills autocomplete - instead of having a free text we should be able to select from a list
  • come up with a list (based on the current skills from all developers)
  • when displaying developers, add a a href link to each skill so that we can click and search developers with that skill
    • for each dev there is a list of skills [devops, golang, javascript] we should be able to add a clickable link to each of these which leads to search page Golang-[skill]-Developers etc
  • any other suggestions welcome
  • any questions https://t.me/+VloraT7W9yA1YTI8

[FEATURE] add ability to add preferred salary for developer profile

developers should be able to add preferred hourly salary when signing up

  • https://golang.cafe/Join-Golang-Community
  • update front-end code HTML/JS adding new number field with USD representing the hourly rate (submit-developer-profile.html)
  • add schema change (backward compatible) nullable field hourly_rate in the developer table
  • update Go endpoint to process and validate the new field
  • add ability to update hourly rate from developer profile
  • add ability to view hourly rate (logged users only! recruiters/admin users only)
  • local testing

automatically detect user login step instead of using hardcoded tokens

we currently have a signon single auth endpoint. the endpoint is used for the following:

  • verify a developer profile
  • authenticate an admin profile
  • authenticate a developer profile
  • [...] more in the future

currently we pass a token that specifies the step. we should be automatically detecting the step based on the existing user in the database so that is less confusing for people when signing in

see code here https://github.com/golang-cafe/golang.cafe/blob/master/pkg/handler/std_handler.go#L1319

[DX] Gorilla Web Toolkit alternatives

Gorilla Web Toolkit has been archived; do you have any alternative in mind that you could replace it with?

It's not safe to keep using it without it being actively maintained.

Can't easily open job ads in new tab

To open job ads in new tab from the home page I need to expand the job, scroll to the bottom of it, middle-click "link", and I've got it in a new tab.

Expected behaviour would be to just middle-click the job title, so I can easily open several job postings in one go. This would also improve the experience without JavaScript (applicable comment I made somewhere else a few days ago).

This is probably as easy as just adding the href=".." here and making sure the JavaScript calls event.preventDefault(), if it doesn't already.

Missing Enviroment variables.

Running locally using the run-local-webserver.sh there's seems to be missing environment variables :

   export PLAN_ID_1_PRICE="#"  
    export PLAN_ID_2_PRICE="#"  
    export PLAN_ID_3_PRICE="#"

The server only runs locally once I added those variables into the script.

[BUG] image crop not working correctly

when uploading an image and cropping, sometimes the cropping functionality does not crop correctly and uses the wrong coordinates resulting in the image being cropped incorrectly.

  • should remove the 'update image' endpoint altogether, use only the 'upload new image' and replace
  • fix the coordinate crop issue, likely a javascript issue but not sure, it could be the incorrect usage of the golang library
  • any questions https://t.me/+VloraT7W9yA1YTI8

[DX] make development address configurable

when running the server in development mode we currently run it on all interfaces so it can be accessible if you are running the code from another server or from your computer and accessing it from another device.

Listening on all interfaces

| <your go server> | ----  | Internet | ----- | <you trying to access the server> |

allow connection from outside, listen on all interfaces

http.ListenAndServe("0.0.0.0:9876", ...)

Your machine - Loopback interface

| <your go server> - <you trying to access the server |

only allow connection from the inside, listen to the local interface only

http.ListenAndServe("127.0.0.1:9876", ...)

Right now the value is hard-coded to all interfaces

server.go

1038 func (s Server) Run() error {
1039         addr := fmt.Sprintf(":%s", s.cfg.Port)
1040         if s.cfg.Env == "dev" {
1041                 log.Printf("local env http://localhost:%s", s.cfg.Port)
1042                 addr = fmt.Sprintf("0.0.0.0:%s", s.cfg.Port)
1043         }
1044         return http.ListenAndServe(
1045                 addr,
1046                 middleware.HTTPSMiddleware(
1047                         middleware.GzipMiddleware(
1048                                 middleware.LoggingMiddleware(middleware.HeadersMiddleware(s.router, s.cfg.Env)),
1049                         ),
1050                         s.cfg.Env,
1051                 ),
1052         )
1053 }

would be awesome to have the ability to configure this via config. This also removes the annoying popup that appears whenever you run the server locally on all interfaces "allow this machine to accept incoming connections?" etc

[FEATURE] refactor database.go to use repository pattern

currently all database logic resides inside a single file called database.go - we would want to have a better maintained structure by using repository pattern. for each object category we would have a repository that abstracts away the database layer. for example

current structure has pkg folder

we could have a structure like the following

internal/
  job/
    handlers.go
    repo.go
    errors.go
    models.go
    sql.go
  developerprofile/
    handlers.go
    repo.go
    errors.go
  ... 

this will make the project much easier to maintain

Java Developer Job

Rate:$82 hour
• Requirements
o Excellent development, coding and scripting skills ie Python, Ruby, Java, JavaScript, PHP, Bash Shell, and Node.js
o Expert knowledge of REST+JSON, web services, SQL and Swagger
o Experienced in BAU security automation strategies
o Demonstrated creative, critical and independent thinking capabilities and troubleshooting skills
o Strong Communication and Collaboration Skills
o Knowledgeable in Infrastructure Security, Vulnerability Management and Policy Compliance
o Experienced in and understanding of Security Practices, Process Flows and Analysis
o Analytical knowledge
o Software Development Lifecycle and Process Automation

• Nice to have
o Knowledge of the Qualys Private Cloud Platform and its associated modules

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.