Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
WilcoApp committed Jan 16, 2024
1 parent 2afaaac commit f749aa5
Show file tree
Hide file tree
Showing 171 changed files with 6,624 additions and 7,323 deletions.
36 changes: 8 additions & 28 deletions .github/workflows/wilco-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,46 +9,26 @@ jobs:
timeout-minutes: 10
name: Pr checks

services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
SECRET_KEY: secret
POSTGRES_DB: anythink-market
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Check out project
uses: actions/checkout@v2

- name: Use Java
uses: actions/setup-java@v4
- name: Use Node.js
uses: actions/setup-node@v3
with:
distribution: "adopt"
java-version: "11"
node-version: "16"

- uses: oNaiPs/secrets-to-env-action@v1
- name: Start MongoDB
uses: supercharge/mongodb-github-action@1.6.0
with:
secrets: ${{ toJSON(secrets) }}
mongodb-version: "4.4"

- name: Setup Node for Wilco Checks
uses: actions/setup-node@v3
- uses: oNaiPs/secrets-to-env-action@v1
with:
node-version: "16"
secrets: ${{ toJSON(secrets) }}

- name: Wilco checks
id: Wilco
uses: trywilco/actions@main
with:
engine: ${{ secrets.WILCO_ENGINE_URL }}

- name: Print server logs on failure
if: ${{ failure() }}
run: |
cat /tmp/output.log
61 changes: 36 additions & 25 deletions backend/.gitignore
Original file line number Diff line number Diff line change
@@ -1,26 +1,37 @@
.gradle/
/build/
!gradle/wrapper/gradle-wrapper.jar
*.db

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
# Logs
logs
*.log
.DS_Store

npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directory
node_modules

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history

.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
3 changes: 1 addition & 2 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
FROM public.ecr.aws/v0a2l7y2/wilco/anythink-backend-java:latest

FROM public.ecr.aws/v0a2l7y2/wilco/anythink-backend-node:latest
10 changes: 10 additions & 0 deletions backend/Dockerfile.aws
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM node:16

WORKDIR /usr/src
COPY backend ./backend
COPY .wilco ./.wilco

# Pre-install npm packages
WORKDIR /usr/src/backend
RUN yarn install

21 changes: 0 additions & 21 deletions backend/LICENSE

This file was deleted.

41 changes: 14 additions & 27 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,22 @@
# Anythink Market Backend

# How it works
The Anythink Market backend is Node web app written with [Express](https://expressjs.com/)

The application uses Spring Boot (Web, Mybatis).
## Dependencies

And the code is organized as this:
- [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) - For generating JWTs used by authentication
- [mongoose](https://github.com/Automattic/mongoose) - For modeling and mapping MongoDB data to javascript
- [mongoose-unique-validator](https://github.com/blakehaswell/mongoose-unique-validator) - For handling unique validation errors in Mongoose. Mongoose only handles validation at the document level, so a unique index across a collection will throw an exception at the driver level. The `mongoose-unique-validator` plugin helps us by formatting the error like a normal mongoose `ValidationError`.
- [passport](https://github.com/jaredhanson/passport) - For handling user authentication
- [slug](https://github.com/dodo/node-slug) - For encoding titles into a URL-friendly format

1. `api` is the web layer implemented by Spring MVC
2. `core` is the business model including entities and services
3. `application` is the high-level services for querying the data transfer objects
4. `infrastructure` contains all the implementation classes as the technique details
## Application Structure

# Getting started
- `app.js` - The entry point to our application. This file defines our express server and connects it to MongoDB using mongoose. It also requires the routes and models we'll be using in the application.
- `config/` - This folder contains configuration for passport as well as a central location for configuration/environment variables.
- `routes/` - This folder contains the route definitions for our API.
- `models/` - This folder contains the schema definitions for our Mongoose models.

You'll need Java 11 installed.
## Error Handling

./gradlew bootRun

To test that it works, open a browser tab at http://localhost:3000/api/tags
Alternatively, you can run:

curl http://localhost:3000/api/tags

# Run test

The repository contains a lot of test cases to cover both api test and repository test.

./gradlew test

# Code format

Use spotless for code format.

./gradlew spotlessJavaApply
In `routes/api/index.js`, we define a error-handling middleware for handling Mongoose's `ValidationError`. This middleware will respond with a 422 status code and format the response to have [error messages the clients can understand](https://github.com/gothinkster/realworld/blob/master/API.md#errors-and-status-codes)
89 changes: 89 additions & 0 deletions backend/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
require("dotenv").config();
var http = require("http"),
path = require("path"),
methods = require("methods"),
express = require("express"),
bodyParser = require("body-parser"),
session = require("express-session"),
cors = require("cors"),
passport = require("passport"),
errorhandler = require("errorhandler"),
mongoose = require("mongoose");

var isProduction = process.env.NODE_ENV === "production";

// Create global app object
var app = express();

app.use(cors());

// Normal express config defaults
app.use(require("morgan")("dev"));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(require("method-override")());
app.use(express.static(__dirname + "/public"));

app.use(
session({
secret: "secret",
cookie: { maxAge: 60000 },
resave: false,
saveUninitialized: false
})
);

if (!isProduction) {
app.use(errorhandler());
}

if (!process.env.MONGODB_URI) {
console.warn("Missing MONGODB_URI in env, please add it to your .env file");
}

mongoose.connect(process.env.MONGODB_URI);
if (isProduction) {
} else {
mongoose.set("debug", true);
}

require("./models/User");
require("./models/Item");
require("./models/Comment");
require("./config/passport");

app.use(require("./routes"));

/// catch 404 and forward to error handler
app.use(function (req, res, next) {
if (req.url === "/favicon.ico") {
res.writeHead(200, { "Content-Type": "image/x-icon" });
res.end();
} else {
const err = new Error("Not Found");
err.status = 404;
next(err);
}
});

/// error handler
app.use(function(err, req, res, next) {
console.log(err.stack);
if (isProduction) {
res.sendStatus(err.status || 500)
} else {
res.status(err.status || 500);
res.json({
errors: {
message: err.message,
error: err
}
});
}
});

// finally, let's start our server...
var server = app.listen(process.env.PORT || 3000, function() {
console.log("Listening on port " + server.address().port);
});
77 changes: 0 additions & 77 deletions backend/build.gradle

This file was deleted.

3 changes: 3 additions & 0 deletions backend/config/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
secret: process.env.NODE_ENV === 'production' ? process.env.SECRET : 'secret'
};
18 changes: 18 additions & 0 deletions backend/config/passport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var User = mongoose.model('User');

passport.use(new LocalStrategy({
usernameField: 'user[email]',
passwordField: 'user[password]'
}, function(email, password, done) {
User.findOne({email: email}).then(function(user){
if(!user || !user.validPassword(password)){
return done(null, false, {errors: {'email or password': 'is invalid'}});
}

return done(null, user);
}).catch(done);
}));

Binary file removed backend/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
Loading

0 comments on commit f749aa5

Please sign in to comment.