Merge pull request #2 from flotte-goes-smart/dev

Dev
pull/4/head
leonnicolas 4 years ago committed by GitHub
commit 3164404218
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,6 +1,7 @@
{ {
"root": true,
"env": { "env": {
"browser": true "node": true
}, },
"extends": [ "extends": [
"standard" "standard"

@ -3,12 +3,13 @@ WORKDIR /
COPY ./src /src COPY ./src /src
COPY ./package*.json ./ COPY ./package*.json ./
COPY ./gulpfile.js ./tsconfig.json ./tslint.json ./ COPY ./gulpfile.js ./tsconfig.json ./
COPY ./ormconfig.json ./
RUN npm install RUN npm install
RUN npm install -g gulp RUN npm install -g gulp
RUN npm install gulp RUN npm install gulp
RUN gulp RUN gulp
EXPOSE 4000 EXPOSE 4000
EXPOSE 5432
CMD ["npm", "start"] CMD ["npm", "start"]

@ -2,10 +2,14 @@
Apollo server written in typescript that handles business logic. Apollo server written in typescript that handles business logic.
## Usage ## Usage
### Configure Postgres
Install postgresql and configure it, so the Database is accessible from remote hosts (only necessary for docker container [Here](https://wiki.archlinux.org/index.php/PostgreSQL))
See postgres client config in __ormconfig.json__
### Docker ### Docker
```bash ```bash
docker build -t <image name> . docker build -t <image name> .
docker run --rm -p 4000:4000 <image name> docker run --rm --network="host" <image name>
``` ```
The Dockerfile is pretty stupid and could produce a smaller image, e.g. with multistage build. The Dockerfile is pretty stupid and could produce a smaller image, e.g. with multistage build.
### Compile and run ### Compile and run

@ -1,6 +1,6 @@
{ {
"type": "postgres", "type": "postgres",
"host": "localhost", "host": "127.17.42.1",
"port": 5432, "port": 5432,
"username": "apollo", "username": "apollo",
"database": "apollo_test", "database": "apollo_test",

10
package-lock.json generated

@ -260,11 +260,6 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/bluebird": {
"version": "3.5.32",
"resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.32.tgz",
"integrity": "sha512-dIOxFfI0C+jz89g6lQ+TqhGgPQ0MxSnh/E4xuC0blhFtyW269+mPG5QeLgbdwst/LvdP8o1y0o/Gz5EHXLec/g=="
},
"@types/body-parser": { "@types/body-parser": {
"version": "1.19.0", "version": "1.19.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
@ -444,11 +439,6 @@
"@types/mime": "*" "@types/mime": "*"
} }
}, },
"@types/validator": {
"version": "13.1.0",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.1.0.tgz",
"integrity": "sha512-gHUHI6pJaANIO2r6WcbT7+WMgbL9GZooR4tWpuBOETpDIqFNxwaJluE+6rj6VGYe8k6OkfhbHz2Fkm8kl06Igw=="
},
"@types/ws": { "@types/ws": {
"version": "7.2.6", "version": "7.2.6",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz",

@ -6,6 +6,7 @@
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"start": "node dist/index.js", "start": "node dist/index.js",
"lint": "eslint --config .eslintrc.json --fix src/**/*.ts",
"start:ci": "node dist/index.js" "start:ci": "node dist/index.js"
}, },
"keywords": [], "keywords": [],
@ -29,8 +30,6 @@
"typescript": "^4.0.2" "typescript": "^4.0.2"
}, },
"dependencies": { "dependencies": {
"@types/bluebird": "^3.5.32",
"@types/validator": "^13.1.0",
"apollo-server": "^2.17.0", "apollo-server": "^2.17.0",
"graphql": "^15.3.0", "graphql": "^15.3.0",
"pg": "^8.3.3", "pg": "^8.3.3",

@ -1,9 +1,16 @@
import { DataSource } from 'apollo-datasource' import { DataSource } from 'apollo-datasource'
import { getConnection, Connection } from 'typeorm'
import { CargoBike } from '../../model/CargoBike'
/** /**
* extended datasource to feed resolvers with data about cargoBikes * extended datasource to feed resolvers with data about cargoBikes
*/ */
export class CargoBikeAPI extends DataSource { export class CargoBikeAPI extends DataSource {
connection : Connection
constructor () {
super()
this.connection = getConnection()
}
/** /**
* Finds cargo bike by id * Finds cargo bike by id
*/ */
@ -13,4 +20,20 @@ export class CargoBikeAPI extends DataSource {
name: token name: token
} }
} }
async updateBike ({ id, token, name }:{id:any, token: string, name: string }) {
const bike = new CargoBike()
bike.id = id
bike.description = token
bike.name = name
this.connection.manager.save(bike)
return {
success: true,
message: token,
bike: {
id,
name
}
}
}
} }

@ -1,6 +1,10 @@
export default { export default {
Query: { Query: {
cargobike: (_: any, { id, token }:{id: any, token: string}, { dataSources }:{dataSources: any}) => CargobikeById: (_: any, { id, token }:{id: any, token: string}, { dataSources }:{dataSources: any}) =>
dataSources.cargoBikeAPI.findCargoBikeById({ id, token }) dataSources.cargoBikeAPI.findCargoBikeById({ id, token })
},
Mutation: {
addBike: (_:any, { id, token, name }:{id: any, token: string, name:string}, { dataSources }:{dataSources: any }) =>
dataSources.cargoBikeAPI.updateBike({ id, token, name })
} }
} }

@ -40,6 +40,7 @@ type CargoBike {
provider: Provider provider: Provider
coordinator: Coordinator coordinator: Coordinator
insuranceData: InsuranceData insuranceData: InsuranceData
loantimes: [LoanTimes]
} }
type InsuranceData { type InsuranceData {
@ -55,6 +56,7 @@ type Coordinator {
note: String note: String
corgoBikes: [CargoBike]! corgoBikes: [CargoBike]!
} }
enum Group{ enum Group{
KL KL
LI LI
@ -65,6 +67,7 @@ enum Group{
TS TS
TK TK
} }
""" """
The BikeModel can be used for instantiate new bikes with a given model. The BikeModel can be used for instantiate new bikes with a given model.
It should only be used to fill in default values. It should only be used to fill in default values.
@ -74,6 +77,7 @@ type BikeModel {
id: ID! id: ID!
name: String name: String
dimensionsAndLoad: DimensionsAndLoad! dimensionsAndLoad: DimensionsAndLoad!
technicalEquipment: TechnicalEquipment!
} }
type ActiveMentor { type ActiveMentor {
@ -81,6 +85,31 @@ type ActiveMentor {
start: Date! start: Date!
end: Date! end: Date!
mentor: ContactInformation! mentor: ContactInformation!
usernamefLotte: String
usernameSlack: String
memberADFC: Boolean!
locationZIPs: [String]
roleCoreTeam: Boolean!
roleCoordinator: Boolean!
roleEmployeADFC: Boolean!
"""
Wahr, wenn die Person Pate ist.
"""
roleMentor: Boolean!
roleAmbulanz: Boolean!
roleBringer: Boolean!
"Date of workshop to become Mentor dt. Pate"
workshopMentor: Date
"Date of last Erste Hilfe Kurs?"
workshopAmbulance: Date
"""
Note the kommentierte Infodaten Tabelle.
This value is calculated form other values.
It is true, if the person is not on the black list and not retired
and is either Mentor dt. Pate or Partner Mentor dt. Partnerpate for at least one bike.
"""
distributedActiveBikeParte: Boolean!
reserve: String
} }
type Taxes { type Taxes {
@ -102,6 +131,7 @@ type ChainSwap {
timeOfSwap: Date timeOfSwap: Date
keyNumberOldAXAChain: String keyNumberOldAXAChain: String
} }
""" """
This type represents a piece of equipment that represents a real physical object. This type represents a piece of equipment that represents a real physical object.
The object must be unique. So it is possible to tell it apart from similar objects by a serial number. The object must be unique. So it is possible to tell it apart from similar objects by a serial number.
@ -195,26 +225,25 @@ enum StickerBikeNameState {
UNKNOWN UNKNOWN
} }
"(dt. Anbieter)"
type Provider { type Provider {
id: ID! id: ID!
name: String! name: String!
formularName: String formularName: String
address: String address: Address
"If Club, at what court registered" "If Club, at what court registered"
registeredAt: String registeredAt: String
registerNumber: String registerNumber: String
providerContactPerson: [ContactInformation] providerContactPerson: [ContactInformation]
email: String
phone: String
isPrivatePerson: Boolean! isPrivatePerson: Boolean!
organisations: Organisation organisation: Organisation
cargoBikes: [CargoBike]! cargoBikes: [CargoBike]!
} }
type ContactInformation { type ContactInformation {
id: ID! id: ID!
name: String! name: String!
firstName: String! firstName: String
retiredAt: Date retiredAt: Date
phoneExtern: String phoneExtern: String
phone2Extern: String phone2Extern: String
@ -222,42 +251,61 @@ type ContactInformation {
phone2Intern: String phone2Intern: String
emailExtern: String emailExtern: String
emailIntern: String emailIntern: String
usernamefLotte: String
usernameSlack: String
memberADFC: Boolean!
locationZIPs: [String]
roleCoreTeam: Boolean!
roleCoordinator: Boolean!
roleEmployeADFC: Boolean!
"""
Wahr, wenn die Person Pate ist.
"""
roleMentor: Boolean!
roleAmbulanz: Boolean!
roleBringer: Boolean!
"Date of workshop to become Mentor dt. Pate"
workshopMentor: Date
"Date of last Erste Hilfe Kurs?"
workshopAmbulance: Date
note: String note: String
"""
Note the kommentierte Infodaten Tabelle.
This value is calculated form other values.
It is true, if the person is not on the black list and not retired
and is either Mentor dt. Pate or Partner Mentor dt. Partnerpate for at least one bike.
"""
distributedActiveBikeParte: Boolean!
reserve: String
} }
type Organisation{ type Organisation{
id: ID! id: ID!
"(dt. Ausleihstation)"
lendinglocation: [LendingStation]
"registration number of association" "registration number of association"
associationNo: String associationNo: String
otherdata: String
}
"(dt. Standort)"
type LendingStation {
id: ID!
contactInformation: [ContactInformation]!
address: Address
loanTimes: LoanTimes
loanPeriods: [LoanPeriod]!
}
"(dt. Ausleihzeiten)"
type LoanTimes {
notes: String
}
"(dt. Zeitscheibe)"
type LoanPeriod{
id: ID!
from: Date!
to: Date
note: String
lendingstation: LendingStation!
cargobike: CargoBike!
}
type Address {
street: String
number: String
zip: String
} }
type Query { type Query {
cargobike(token:String!,id:ID!): CargoBike CargobikeById(token:String!,id:ID!): CargoBike
Cargobikes(token:String!): [CargoBike]!
CargobikesByProvider(token:String!,providerId:ID!): [CargoBike]!
ProviderById(token:String!,id:ID!): Provider
Providers(token:String!): [Provider]!
ActiveMentorById(token:String!,id:ID!): ActiveMentor
ActiveMentors(token:String!): [ActiveMentor]!
lendingStationById(token:String!, id:ID!): LendingStation
lendingStations(token:String!): [LendingStation]!
contactInformation(token:String!): [ContactInformation]!
} }
type UpdateBikeResponse { type UpdateBikeResponse {
@ -265,9 +313,46 @@ type UpdateBikeResponse {
message: String message: String
bike: CargoBike bike: CargoBike
} }
"for testing"
input CargoBikeInput {
"if null, then new bike will be created, else old bike will be updated"
id: ID
"see column A in info tabelle"
group: Group
name: String
modelName: String
numberOfWheels: Int
forCargo: Boolean
forChildren: Boolean
numberOfChildren: Int
serialno: String
"""
Safety is a custom type, that stores information about security features.
TODO: Should this be calles Security?
"""
security: String
"""
Does not refere to an extra table in the database.
"""
technicalEquipment: String
"""
Does not refere to an extra table in the database.
"""
dimensionsAndLoad: String
"Refers to equipment that is not unique. See kommentierte info tabelle -> Fragen -> Frage 2"
otherEquipment: String
"Sticker State"
stickerBikeNameState: String
note: String
provider: String
coordinator: String
insuranceData: String
}
type Mutation { type Mutation {
addBike(id: ID!):UpdateBikeResponse "for testing"
addBike(id: ID!, token: String!, name: String): UpdateBikeResponse!
"if id: null, then new bike will be created, else old bike will be updated"
cargoBike(token:String!,cargoBike: CargoBikeInput): UpdateBikeResponse!
} }
` `

Loading…
Cancel
Save