Skip to content

Commit

Permalink
Merge pull request #17 from aarontravass/aaron/readme
Browse files Browse the repository at this point in the history
Update README.md
  • Loading branch information
aarontravass authored Jul 14, 2024
2 parents 60a93eb + 2603b18 commit 7c5b868
Show file tree
Hide file tree
Showing 31 changed files with 109 additions and 41 deletions.
61 changes: 60 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,60 @@
# Submission for MediHacks 2024
<div align="center">
<img src="https://github.com/user-attachments/assets/64d1df45-553a-4e51-a8e9-6ca8d6e2f0a5" >
</div>

<div align="center">

[![CI](https://github.com/aarontravass/Athena/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/aarontravass/Athena/actions/workflows/ci.yml)

</div>

<hr>
<br>

Data transparency and ownership are global challenges, with most patient health records controlled by providers. This centralization limits patient access and hinders data sharing across systems.

A distributed, reliable, and transparent storage system is needed to enhance data accessibility, security, and empower patients with greater control over their health records.

Athena is the modern EMR and EHR open source storage solution based on IPFS. Built on top of Filebase, it addresses problems with data ownership and transparency in the health sector. By leveraging blockchains, we can create a decentralized network that ensures data integrity and transparency, reducing the risk of data breaches and unauthorized access.

### Table of Contents

- [Features](#core-features)
- [Install](#install)
- [License](#license)

## Features

- **Distributed and scalable:** Built using GraphQL, Fastify and PostgreSQL, containerized via Docker and deployed on Vercel and Render.
- **Encryption in Transit:** All files are encrypted using AES-256.
- **Controlled sharing:** Share documents using signed links

## Install

Clone the repository

```sh
git clone https://github.com/aarontravass/Athena.git
```

Install dependencies

```sh
pnpm i
```

Generate prisma dist

```sh
lerna run --scope @athena/prisma generate
```

Run web, server and upload package

```sh
lerna run dev
```

## License

Licensed under [MIT](./LICENSE).
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
},
"scripts": {
"lint": "eslint .",
"format": "prettier --check \"./**/*.{ts,js,tsx}\"",
"format:fix": "prettier --write \"./**/*.{ts,js,tsx}\"",
"format": "prettier --check \"./**/*.{ts,js,tsx,md}\"",
"format:fix": "prettier --write \"./**/*.{ts,js,tsx,md}\"",
"prepare": "husky"
},
"packageManager": "[email protected]",
Expand Down
4 changes: 2 additions & 2 deletions packages/platform/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@medihacks/platform",
"name": "@athena/platform",
"version": "0.0.0",
"description": "> TODO: description",
"author": "aarontravass <[email protected]>",
Expand All @@ -25,7 +25,7 @@
},
"dependencies": {
"@aws-sdk/client-s3": "3.47.0",
"@medihacks/prisma": "workspace:^",
"@athena/prisma": "workspace:^",
"@pothos/core": "^3.41.2",
"@pothos/plugin-prisma": "^3.65.3",
"@pothos/plugin-scope-auth": "^3.22.1",
Expand Down
4 changes: 2 additions & 2 deletions packages/platform/src/builder.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Prisma, UserRole } from '@medihacks/prisma'
import { Prisma, UserRole } from '@athena/prisma'
import SchemaBuilder from '@pothos/core'
import PrismaPlugin from '@pothos/plugin-prisma'
import { GraphQLError } from 'graphql'
Expand All @@ -7,7 +7,7 @@ import { YogaInitialContext } from 'graphql-yoga'
import { prisma } from './prisma'
import ScopeAuthPlugin from '@pothos/plugin-scope-auth'
import ValidationPlugin from '@pothos/plugin-validation'
import type PrismaTypes from '@medihacks/prisma/pothos-types'
import type PrismaTypes from '@athena/prisma/pothos-types'
import { hasRole } from './validation/auth'

export interface CustomContext extends YogaInitialContext {
Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/filebase.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { S3 } from '@aws-sdk/client-s3'
import { FILEBASE_ACCESS_KEY_ID, FILEBASE_S3_URL, FILEBASE_SECRET_ACCESS_KEY } from './constants'
import { PatientFile } from '@medihacks/prisma'
import { PatientFile } from '@athena/prisma'
import { GraphQLError } from 'graphql'
import { streamToBase64 } from './utils'

Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/prisma.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { PrismaClient } from '@medihacks/prisma'
import { PrismaClient } from '@athena/prisma'

export const prisma = new PrismaClient({})
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { generateAuthAndRefreshTokens } from '../../../utils'
import { getUserFromPrivy } from '../../../privy'
import { createBucket } from '../../../filebase'
import { UserRoleEnum } from '../../../schema/UserRole.enum'
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'

builder.mutationField('createAuthToken', (t) =>
t.prismaField({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { GraphQLError } from 'graphql'
Expand Down Expand Up @@ -29,7 +29,7 @@ builder.mutationField('createShareToken', (t) =>
},
FILE_TOKEN_JWT_KEY!,
{
issuer: 'medihacks',
issuer: 'athena',
expiresIn: ttl
}
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { FileShareToken } from '../../../schema/FileShareToken.schema'
import { prisma } from '../../../prisma'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { GraphQLError } from 'graphql'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { GraphQLError } from 'graphql'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { PatientFile } from '../../../schema/PatientFile.schema'
import { prisma } from '../../../prisma'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { GraphQLError } from 'graphql'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { fetchFileAsBase64 } from '../../../filebase'
import jsonwebtoken from 'jsonwebtoken'
import { FILE_TOKEN_JWT_KEY } from '../../../constants'

builder.queryField('viewSharedFileBlob', (t) =>
t.string({
Expand All @@ -17,7 +19,14 @@ builder.queryField('viewSharedFileBlob', (t) =>
})
if (!shareToken) throw new GraphQLError('You do not have access to view this resource!')

return fetchFileAsBase64(shareToken.patientFile)
try {
jsonwebtoken.verify(token, FILE_TOKEN_JWT_KEY!, {
issuer: 'athena'
})
return fetchFileAsBase64(shareToken.patientFile)
} catch (error) {
throw new GraphQLError('This link has expired')
}
}
})
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { PatientStorage } from '../../../schema/PatientStorage.schema'
import { prisma } from '../../../prisma'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { UPLOAD_URL } from '../../../constants'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { GraphQLError } from 'graphql'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { User } from '../../../schema/User.schema'
import { prisma } from '../../../prisma'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { User } from '../../../schema/User.schema'
import { prisma } from '../../../prisma'
Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/resolvers/User/queries/fetchUser.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../../../builder'
import { prisma } from '../../../prisma'
import { User } from '../../../schema/User.schema'
Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/schema/UserRole.enum.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'
import { builder } from '../builder'

export const UserRoleEnum = builder.enumType(UserRole, {
Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/ucan.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as ucans from '@ucans/ucans'
import { ED_SECRET_KEY, ORG_DID } from './constants'
import { User, UserRole } from '@medihacks/prisma'
import { User, UserRole } from '@athena/prisma'
import { prisma } from './prisma'
import { CustomContext } from './builder'

Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { User } from '@medihacks/prisma'
import { User } from '@athena/prisma'
import { createDecipheriv, randomUUID } from 'node:crypto'
import { generateUCAN } from './ucan'
import { FILE_ENCRYPTION_KEY } from './constants'
Expand Down
2 changes: 1 addition & 1 deletion packages/platform/src/validation/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CustomContext } from '../builder'
import { verifyAuthToken } from '../privy'
import { prisma } from '../prisma'
import { parseUCAN, verifyUCAN } from '../ucan'
import { UserRole } from '@medihacks/prisma'
import { UserRole } from '@athena/prisma'

export const fetchPrivyDidFromAuth = (authToken: string) =>
verifyAuthToken(authToken)
Expand Down
2 changes: 1 addition & 1 deletion packages/prisma/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@medihacks/prisma",
"name": "@athena/prisma",
"version": "0.0.0",
"description": "> TODO: description",
"author": "aarontravass <[email protected]>",
Expand Down
4 changes: 2 additions & 2 deletions packages/upload/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@medihacks/upload",
"name": "@athena/upload",
"version": "0.0.0",
"description": "> TODO: description",
"author": "aarontravass <[email protected]>",
Expand All @@ -26,7 +26,7 @@
"@aws-sdk/client-s3": "3.47.0",
"@fastify/cors": "^9.0.1",
"@fastify/multipart": "^8.3.0",
"@medihacks/prisma": "workspace:^",
"@athena/prisma": "workspace:^",
"fastify": "^4.28.1"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/upload/src/filebase.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { S3 } from '@aws-sdk/client-s3'
import { FILEBASE_ACCESS_KEY_ID, FILEBASE_S3_URL, FILEBASE_SECRET_ACCESS_KEY } from './constants'
import { User } from '@medihacks/prisma'
import { User } from '@athena/prisma'
import type { MultipartFile } from '@fastify/multipart'
import { encryptBuffer } from './utils'

Expand Down
2 changes: 1 addition & 1 deletion packages/upload/src/prisma.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { PrismaClient } from '@medihacks/prisma'
import { PrismaClient } from '@athena/prisma'

export const prisma = new PrismaClient({})
2 changes: 1 addition & 1 deletion packages/upload/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ fastify.post('/upload', async (req, res) => {
return res.status(200).send({ success: true })
})

fastify.listen({ port: PORT }, (err) => {
fastify.listen({ port: PORT, host: '0.0.0.0' }, (err) => {
if (err) throw err
console.log(`server listening on ${PORT}`)
})
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@medihacks/web",
"name": "@athena/web",
"version": "0.1.0",
"author": "ashup99 <[email protected]>",
"license": "MIT",
Expand Down
12 changes: 6 additions & 6 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 7c5b868

Please sign in to comment.