Skip to content

Commit

Permalink
Merge branch 'feat/near-me' of github.com:ChakshuGautam/geoquery.in i…
Browse files Browse the repository at this point in the history
…nto feat/near-me
  • Loading branch information
KDwevedi committed Dec 24, 2024
2 parents a193ac4 + e87d883 commit beac51d
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 156 deletions.
1 change: 1 addition & 0 deletions .env.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DATABASE_URL=postgresql://admin:password@192.168.1.43:5555/gis
98 changes: 28 additions & 70 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,79 +1,37 @@
#FROM node:18.16.1-alpine
#
#COPY setup.sh
#
#RUN apk add --no-cache bash
#RUN npm i -g @nestjs/cli typescript ts-node
#
#COPY package*.json /tmp/app/
#RUN cd /tmp/app && npm install
#
#COPY . /usr/src/app
#RUN cp -a /tmp/app/node_modules /usr/src/app
#COPY ./wait-for-it.sh /opt/wait-for-it.sh
#COPY ./startup.dev.sh /opt/startup.dev.sh
#RUN sed -i 's/
#//g' /opt/wait-for-it.sh
#RUN sed -i 's/
#//g' /opt/startup.dev.sh
#
#WORKDIR /usr/src/app
#RUN cp env-example .env
#RUN npx prisma generate
#RUN npm run build
#
#CMD ["/opt/startup.dev.sh"]
#
#EXPOSE 3000
FROM node:18-slim as base
RUN apt-get update -y && apt-get install -y openssl


#FROM node:18.16.1-alpine
#
#WORKDIR /usr/src/app
#
#COPY . .
#
#RUN apt-get update && apt-get install -y curl && apt-get install -y git
#CMD /bin/bash
#COPY ./package*.json ./
#RUN ./setup.sh
#
#ENV NODE_ENV production
#CMD ["npm", "i"]
#CMD [ "npm", "run", "start:dev" ]
#
#EXPOSE 3000


FROM node:20.11.0-alpine

# Set the working directory
WORKDIR /usr/src/app

# Install curl and git using apk
RUN apk update && apk add --no-cache curl git

RUN #npm config set registry http://registry.npmjs.org/

# Copy package files first for better caching of npm install
COPY ./package*.json ./

# Install dependencies
FROM base AS install
WORKDIR /app
COPY package*.json ./
RUN npm install

# Copy the rest of the application code
FROM base as build
WORKDIR /app
COPY prisma ./prisma/
COPY --from=install /app/node_modules ./node_modules
RUN npx prisma generate
COPY . .
RUN npm run build

# Convert setup.sh to Unix-style line endings (LF)
FROM base as data
WORKDIR /app
COPY --from=install /app/node_modules ./node_modules
COPY . .
RUN sed -i 's/\r$//' ./setup.sh


# Run any additional setup script
RUN chmod +x ./setup.sh
RUN ./setup.sh

# Set environment variable
ENV NODE_ENV production

# Start the application
CMD ["npm", "run", "start:dev"]
FROM base
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY --from=build /app/package*.json ./
COPY --from=build /app/prisma ./prisma
COPY --from=data /app/db.mmdb ./db.mmdb
COPY --from=data /app/src/geojson-data ./src/geojson-data
COPY ./src ./src
COPY tsconfig.json ./tsconfig.json
EXPOSE 3000

CMD ["npm", "run", "migrate:ingest:start:prod"]
77 changes: 6 additions & 71 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,74 +1,9 @@
services:
fusionauth:
image: fusionauth/fusionauth-app:latest
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: jdbc:postgresql://postgres:5432/fusionauth
DATABASE_ROOT_USERNAME: ${POSTGRES_USER}
DATABASE_ROOT_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_USERNAME: ${DATABASE_USERNAME}
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
FUSIONAUTH_APP_MEMORY: ${FUSIONAUTH_APP_MEMORY}
FUSIONAUTH_APP_RUNTIME_MODE: ${FUSIONAUTH_APP_RUNTIME_MODE}
FUSIONAUTH_APP_URL: http://fusionauth:9011
FUSIONAUTH_APP_KICKSTART_FILE: /usr/local/fusionauth/kickstarts/kickstart.json
env_file:
- ./env-example
volumes:
- fa-config:/usr/local/fusionauth/config
- ./kickstart:/usr/local/fusionauth/kickstarts
networks:
- default
restart: unless-stopped
ports:
- 9011:9011

postgres:
image: postgres:15.3-alpine
geoquery:
build:
context: .
dockerfile: Dockerfile
ports:
- ${DATABASE_PORT}:5432
volumes:
- ./.data/db:/var/lib/postgresql/data
- "3000:3000"
environment:
POSTGRES_USER: ${DATABASE_USERNAME}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_NAME}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5

shadow-postgres:
image: postgres:15.3-alpine
ports:
- ${SHADOW_DATABASE_PORT}:5432
volumes:
- ./.data/shadow-db:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${SHADOW_DATABASE_USERNAME}
POSTGRES_PASSWORD: ${SHADOW_DATABASE_PASSWORD}
POSTGRES_DB: ${SHADOW_DATABASE_NAME}

cache:
image: redis:6.2-alpine
restart: always
ports:
- '${CACHE_PORT}:6379'
command: redis-server --save 20 1
volumes:
- cache:/data

# api:
# build:
# context: .
# dockerfile: Dockerfile
# ports:
# - 3000:3000
volumes:
fa-config:
cache:
networks:
default:
DATABASE_URL: postgresql://admin:password@192.168.1.43:5555/gis
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
"start:dev": "stencil start --watch",
"start:debug": "stencil start --debug --watch",
"start:prod": "NODE_ENV=production node dist/main",
"migrate:ingest:start:prod": "npx ts-node src/scripts/ingestors/state.geojson.ts && npx ts-node src/scripts/ingestors/district.geojson.ts && npx ts-node src/scripts/ingestors/subdistrict.geojson.ts && npm run migrate:start:prod",
"migrate:start:prod": "npx prisma migrate deploy && npm run start:prod",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
Expand Down Expand Up @@ -41,7 +43,12 @@
"multer": "^1.4.5-lts.1",
"reflect-metadata": "^0.1.13",
"request-ip": "^3.3.0",
"rxjs": "^7.8.1"
"rxjs": "^7.8.1",
"ts-jest": "^29.1.0",
"ts-loader": "^9.4.3",
"ts-node": "^10.9.2",
"tsconfig-paths": "^4.2.0",
"typescript": "^5.1.3"
},
"devDependencies": {
"@nestjs/testing": "^10.0.0",
Expand Down
40 changes: 35 additions & 5 deletions setup.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,40 @@
mkdir ./src/geojson-data

is_wget2_installed() {
if command -v wget2 &> /dev/null; then
return 0 # wget2 is installed
else
return 1 # wget2 is not installed
fi
}

if is_wget2_installed; then
echo "wget2 is already installed."
else
# Check if the OS is macOS or Linux
if [[ "$(uname)" == "Darwin" ]]; then
echo "macOS detected. Installing wget2 using Homebrew..."
# Check if Homebrew is installed, if not install it
if ! command -v brew &> /dev/null; then
echo "Homebrew not found. Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Install wget2 using Homebrew
brew install wget
elif [[ "$(uname)" == "Linux" ]]; then
echo "Linux detected. Installing wget2 using apt..."
# Update package list and install wget2 using apt
sudo apt update
sudo apt install wget2 -y
else
echo "Unsupported OS detected."
exit 1
fi
fi

# curl -o ./db.mmdb -L --fail --compressed https://mmdbcdn.posthog.net
# getting the latest db.mmdb
curl -o ./db.mmdb -L --fail --compressed https://mmdbcdn.posthog.net
wget2 -O db.mmdb https://mmdbcdn.posthog.net

cd ./src

Expand Down Expand Up @@ -44,7 +77,4 @@ cd ../..

# Updating geoJSON files through script to make them usable in src
cd ./scripts
npx ts-node parse.geojson.ts

# Changing PWD back to /server/
cd - &> /dev/null
npx ts-node parse.geojson.ts
6 changes: 2 additions & 4 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ async function bootstrap() {
const logger = new Logger('Main'); // 'Main' is the context name

const configService = app.get(ConfigService);
const port = configService.get<number>('port');
const host = configService.get<string>('host');

// Register plugins and middleware
await app.register(multipart);
Expand All @@ -44,8 +42,8 @@ async function bootstrap() {
SwaggerModule.setup('api-docs', app, document);

// Start the server
await app.listen(port, host, (err, address) => {
logger.log(`Server running on ${host}:${port}`);
await app.listen(3000, '0.0.0.0', (err, address) => {
logger.log(`Server running on 0.0.0.0:3000`);
});

// Log additional information as needed
Expand Down
4 changes: 2 additions & 2 deletions src/modules/georev/georev.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe('GeorevController', () => {
const result = await controller.getGeoRev(lat, lon);
} catch (error) {
expect(error).toBeInstanceOf(HttpException);
expect(error.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR);
expect(error.getStatus()).toBe(HttpStatus.BAD_REQUEST);
expect(error.getResponse()).toEqual({
status: 'fail',
error: 'lat lon query missing',
Expand All @@ -98,7 +98,7 @@ describe('GeorevController', () => {
}
catch (error) {
expect(error).toBeInstanceOf(HttpException);
expect(error.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR);
expect(error.getStatus()).toBe(HttpStatus.BAD_REQUEST);
expect(error.getResponse()).toEqual({
status: 'fail',
error: 'Invalid latitude or longitude',
Expand Down
4 changes: 2 additions & 2 deletions src/modules/georev/georev.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ export class GeorevController {
this.logger.error(`lat lon query missing`);
throw new HttpException(
{ status: 'fail', error: `lat lon query missing` },
HttpStatus.INTERNAL_SERVER_ERROR,
HttpStatus.BAD_REQUEST,
);
}

if (!this.geoRevService.isValidLatitudeLongitude(lat, lon)) {
this.logger.error('Invalid latitude or longitude');
throw new HttpException(
{ 'status': 'fail', 'error': 'Invalid latitude or longitude' },
HttpStatus.INTERNAL_SERVER_ERROR,
HttpStatus.BAD_REQUEST,
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/modules/place/place.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Injectable, Logger } from "@nestjs/common";
import { HttpException, HttpStatus, Injectable, Logger } from "@nestjs/common";
import { CreatePlaceDto, SearchPlaceDto } from "./dto/place.dto";
import { PrismaService } from "../prisma/prisma.service";
import { Prisma } from "@prisma/client";
Expand Down

0 comments on commit beac51d

Please sign in to comment.