diff --git a/.env.example b/.env.example index ade9050..982fb26 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,5 @@ +API_URL='127.0.0.1:3000/' + # Mailgun # Create a free account at https://app.mailgun.com/new/signup/, Use the sandbox domain SMTP user/pass MAILGUN_USERNAME='' diff --git a/client/components/Jobs/Add.js b/client/components/Jobs/Add.js index 19f0536..118b373 100644 --- a/client/components/Jobs/Add.js +++ b/client/components/Jobs/Add.js @@ -84,6 +84,7 @@ export default connect(mapStateToProps, mapDispatchToProps)( initialValues: { type: "fulltime", experience_range: 100, + salary_range: 30, remote_available: false, recruiter: false, description: DESCRIPTION_TEMPLATE diff --git a/client/components/Jobs/Form/index.js b/client/components/Jobs/Form/index.js index 2295cbf..581259b 100644 --- a/client/components/Jobs/Form/index.js +++ b/client/components/Jobs/Form/index.js @@ -12,12 +12,20 @@ export const TYPE_OPTIONS = [ ]; export const EXPERIENCE_OPTIONS = [ - { label: "", value: "" }, + { value: "", label: "" }, { value: 100, label: "Junior (Learner: 1-3 Years)" }, { value: 200, label: "Midlevel (Producer: 3-5 Years)" }, { value: 300, label: "Senior (Multiplier: 5+ Years)" } ]; +export const SALARY_OPTIONS = [ + { value: "", label: "" }, + { value: 30, label: "$30,000 - $50,000" }, + { value: 50, label: "$50,000 - $80,000" }, + { value: 80, label: "$80,000 - $100,000" }, + { value: 100, label: "$100,000+" } +]; + function _getValue(options) { return value => { const option = options.find(o => o.value === value); @@ -27,6 +35,7 @@ function _getValue(options) { export const getType = _getValue(TYPE_OPTIONS); export const getExperience = _getValue(EXPERIENCE_OPTIONS); +export const getSalary = _getValue(SALARY_OPTIONS); export const CompanyField = props => ( label="Company" help={companyHelp()} />); + export const TypeField = () => ( label="Experience Range" />); +export const SalaryField = () => +(); + const descHelp = () => ( Tip: You can use{" "} @@ -100,12 +118,7 @@ export const JobForm = props => {
Experience and Compensation - +
Contact Information diff --git a/client/components/Jobs/View.js b/client/components/Jobs/View.js index ebc9ef3..12cb2b0 100644 --- a/client/components/Jobs/View.js +++ b/client/components/Jobs/View.js @@ -3,7 +3,7 @@ import { Link } from "react-router"; import { connect } from "react-redux"; import capitalize from "lodash/capitalize"; import MarkdownViewer from "../Markdown/Viewer"; -import { getExperience, getType } from "./Form"; +import { getExperience, getType, getSalary } from "./Form"; import { getJob } from "../../actions/jobs"; import Messages from "../Messages"; @@ -35,13 +35,11 @@ class JobView extends Component { className="job-tag job-type" title={`${capitalize(job.type)} employment.`} > - {getType(job.type)} @ ${job.salary_range - .toString() - .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}/yr + {getType(job.type)} @ {getSalary(job.salary_range)}
XP: {getExperience(job.experience_range)}
diff --git a/server/controllers/job.js b/server/controllers/job.js index 665603f..5102dab 100644 --- a/server/controllers/job.js +++ b/server/controllers/job.js @@ -32,9 +32,8 @@ exports.create = async function(req, res, next) { .assert("experience_range", "Please enter a valid experience range.") .isInt(); req - .assert("salary_range", "Salaries Must be at least $30,000.") + .assert("salary_range", "Please enter a valid salary range.") .isInt() - .gte(30000); req .assert( "remote_available", diff --git a/server/migrations/20160315161907_users.js b/server/db/migrations/20160315161907_users.js similarity index 100% rename from server/migrations/20160315161907_users.js rename to server/db/migrations/20160315161907_users.js diff --git a/server/migrations/20170712183917_company.js b/server/db/migrations/20170712183917_company.js similarity index 100% rename from server/migrations/20170712183917_company.js rename to server/db/migrations/20170712183917_company.js diff --git a/server/migrations/20170712202513_company.js b/server/db/migrations/20170712202513_company.js similarity index 100% rename from server/migrations/20170712202513_company.js rename to server/db/migrations/20170712202513_company.js diff --git a/server/migrations/20170717195038_company.js b/server/db/migrations/20170717195038_company.js similarity index 100% rename from server/migrations/20170717195038_company.js rename to server/db/migrations/20170717195038_company.js index a14f06b..add27ef 100644 --- a/server/migrations/20170717195038_company.js +++ b/server/db/migrations/20170717195038_company.js @@ -10,8 +10,8 @@ exports.up = function(knex, Promise) { exports.down = function(knex, Promise) { return Promise.all([ knex.schema.table("companies", function(table) { - table.dropColumn("user_id"); table.dropForeign("user_id"); + table.dropColumn("user_id"); }) ]); }; diff --git a/server/migrations/20170718194414_jobs.js b/server/db/migrations/20170718194414_jobs.js similarity index 100% rename from server/migrations/20170718194414_jobs.js rename to server/db/migrations/20170718194414_jobs.js diff --git a/server/migrations/20170801194506_jobs.js b/server/db/migrations/20170801194506_jobs.js similarity index 100% rename from server/migrations/20170801194506_jobs.js rename to server/db/migrations/20170801194506_jobs.js diff --git a/server/db/migrations/20170815115709_add_salary_range_to_jobs.js b/server/db/migrations/20170815115709_add_salary_range_to_jobs.js new file mode 100644 index 0000000..001c9e9 --- /dev/null +++ b/server/db/migrations/20170815115709_add_salary_range_to_jobs.js @@ -0,0 +1,21 @@ +exports.up = function(knex, Promise) { + return Promise.all([ + knex("jobs") + .whereBetween("salary_range", [30000, 49999]) + .update({salary_range: 30}), + knex("jobs") + .whereBetween("salary_range", [50000, 79999]) + .update({salary_range: 50}), + knex("jobs") + .whereBetween("salary_range", [80000, 99999]) + .update({salary_range: 80}), + knex("jobs") + .whereBetween("salary_range", [100000, 999999]) + .update({salary_range: 100}) + ]); +}; + +exports.down = function(knex, Promise) { + return Promise.all([ + ]); +}; \ No newline at end of file diff --git a/server/db/seeds/seed_dev_data.js b/server/db/seeds/seed_dev_data.js new file mode 100644 index 0000000..01b5742 --- /dev/null +++ b/server/db/seeds/seed_dev_data.js @@ -0,0 +1,59 @@ +var bcrypt = require("bcrypt-nodejs"); + +exports.seed = function (knex, Promise) { + return Promise.all([ + knex('jobs').del().then(), + knex('companies').del().then(), + knex('users').del().then(), + new Promise(function (resolve, reject) { + bcrypt.genSalt(10, function (err, salt) { + bcrypt.hash('nashdev', salt, null, function (err, hash) { + return knex('users').insert([ + { + id: 1, + name: 'Nashville Developer', + email: 'jobs@nashdev.org', + location: 'Nashville', + password: hash + }, + ]).then(function () { + return knex('companies').insert([ + { + id: 1, + name: 'Nashville Company', + location: 'Nashville', + phone: '(615) 555-5555', + size: '20', + description: 'We develop software in Nashville.', + user_id: 1 + }, + ]) + }) + .then(function () { + return knex('jobs').insert([ + { + id: 1, + user_id: 1, + company_id: 1, + title: "Half Stack Web Developer", + description: "Pick your favorite.", + status: "open", + type: "fulltime", + recruiter: false, + location: "Nashville", + contact_email: "jobs@nashdev.org", + contact_website: "jobs.nashdev.org", + contact_person: "Dev Jobs", + experience_range: 100, + salary_range: 40000, + remote_available: true + } + ]) + }) + }) + }) + }) + ]) +} + + diff --git a/server/knexfile.js b/server/knexfile.js index c091e21..0005ebd 100644 --- a/server/knexfile.js +++ b/server/knexfile.js @@ -11,6 +11,9 @@ module.exports = { database: process.env.DB_NAME }, migrations: { - directory: "./server/migrations" + directory: "./db/migrations" + }, + seeds: { + directory: './db/seeds' } }; diff --git a/server/models/Company.js b/server/models/Company.js index 8198f3f..cfa278d 100644 --- a/server/models/Company.js +++ b/server/models/Company.js @@ -1,4 +1,17 @@ var Bookshelf = require("../config/bookshelf"); +/* ++------------------+--------------------------+-----------------------+ +| Column | Type | Modifiers | +|------------------+--------------------------+-----------------------| +| id | integer | | +| name | character varying(255) | unique | +| location | character varying(255) | | +| phone | character varying(255) | | +| size | text | | +| description | text | | +| user_id | integer | references user.id | ++------------------+--------------------------+-----------------------+ +*/ var Company = Bookshelf.Model.extend( { diff --git a/server/models/User.js b/server/models/User.js index 4f7e508..03a4430 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -2,6 +2,28 @@ var crypto = require("crypto"); var bcrypt = require("bcrypt-nodejs"); var Bookshelf = require("../config/bookshelf"); +/* ++-----------------------+--------------------------+--------------+ +| Column | Type | Modifiers | +|-----------------------+--------------------------+--------------| +| id | integer | | +| name | character varying(255) | | +| email | character varying(255) | unique | +| password | character varying(255) | | +| passwordResetToken | character varying(255) | | +| passwordResetExpires | timestamp with time zone | | +| gender | character varying(255) | | +| location | character varying(255) | | +| website | character varying(255) | | +| picture | character varying(255) | | +| facebook | character varying(255) | | +| github | character varying(255) | | +| twitter | character varying(255) | | +| google | character varying(255) | | +| vk | character varying(255) | | ++-----------------------+--------------------------+--------------+ +*/ + var User = Bookshelf.Model.extend({ tableName: "users", hasTimestamps: true,