add create account/blog functions
This commit is contained in:
		
							parent
							
								
									fec3c33310
								
							
						
					
					
						commit
						cad4c59d51
					
				
					 6 changed files with 367 additions and 7 deletions
				
			
		
							
								
								
									
										29
									
								
								src/db/account.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/db/account.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| import { ulid } from "ulid"; | ||||
| import { hash } from "argon2"; | ||||
| 
 | ||||
| import { Account } from "./entities/account.js"; | ||||
| import MercuryDataSource from "./index.js"; | ||||
| 
 | ||||
| const missingAuthData = new Error("missing auth data for local user"); | ||||
| 
 | ||||
| /** Creates a new account. */ | ||||
| export async function createAccount( | ||||
|   username: string, | ||||
|   host: string | null, | ||||
|   auth: { email: string; password: string } | null | ||||
| ) { | ||||
|   if (auth && (!auth.email || !auth.password)) throw missingAuthData; | ||||
| 
 | ||||
|   const account = new Account(); | ||||
|   account.id = ulid(); | ||||
|   account.username = username; | ||||
|   account.host = host; | ||||
|   if (auth) { | ||||
|     account.email = auth.email; | ||||
|     account.password = await hash(auth.password); | ||||
|   } | ||||
| 
 | ||||
|   await MercuryDataSource.getRepository(Account).save(account); | ||||
| 
 | ||||
|   return account; | ||||
| } | ||||
							
								
								
									
										27
									
								
								src/db/blog.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/db/blog.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| import { ulid } from "ulid"; | ||||
| 
 | ||||
| import { Account } from "./entities/account.js"; | ||||
| import { Blog } from "./entities/blog.js"; | ||||
| import { generateKeyPair } from "./util/rsa.js"; | ||||
| import MercuryDataSource from "./index.js"; | ||||
| 
 | ||||
| export const notLocalAccount = new Error("account is not local"); | ||||
| 
 | ||||
| /** Create a local blog. Throws an error if the given account is not a local account. */ | ||||
| export async function createLocalBlog(account: Account, name: string) { | ||||
|   if (account.host) throw notLocalAccount; | ||||
| 
 | ||||
|   const keyPair = await generateKeyPair(); | ||||
| 
 | ||||
|   const blog = new Blog(); | ||||
|   blog.id = ulid(); | ||||
|   blog.username = name; | ||||
|   blog.host = account.host; | ||||
|   blog.account = account; | ||||
|   blog.publicKey = keyPair.publicKey; | ||||
|   blog.privateKey = keyPair.privateKey; | ||||
| 
 | ||||
|   await MercuryDataSource.getRepository(Blog).save(blog); | ||||
| 
 | ||||
|   return blog; | ||||
| } | ||||
							
								
								
									
										20
									
								
								src/db/util/rsa.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/db/util/rsa.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| import * as crypto from "node:crypto"; | ||||
| import * as util from "node:util"; | ||||
| 
 | ||||
| const generate = util.promisify(crypto.generateKeyPair); | ||||
| 
 | ||||
| export async function generateKeyPair() { | ||||
|   return await generate("rsa", { | ||||
|     modulusLength: 2048, | ||||
|     publicKeyEncoding: { | ||||
|       type: "spki", | ||||
|       format: "pem", | ||||
|     }, | ||||
|     privateKeyEncoding: { | ||||
|       type: "pkcs8", | ||||
|       format: "pem", | ||||
|       cipher: undefined, | ||||
|       passphrase: undefined, | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										17
									
								
								src/seed.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/seed.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| import MercuryDataSource from "./db/index.js"; | ||||
| import { createAccount } from "./db/account.js"; | ||||
| import { createLocalBlog } from "./db/blog.js"; | ||||
| import log from "./log.js"; | ||||
| 
 | ||||
| // This just creates a single local user (that can't log in) called "testington", and one blog called "testington".
 | ||||
| // This is not usable for anything more than testing a handful of endpoints, TODO: expand this
 | ||||
| async function seed() { | ||||
|   await MercuryDataSource.initialize(); | ||||
| 
 | ||||
|   const account = await createAccount("testington", null, null); | ||||
|   const blog = await createLocalBlog(account, "testington"); | ||||
| 
 | ||||
|   log.info("Created account %s with blog %s", account.id, blog.id); | ||||
| } | ||||
| 
 | ||||
| seed(); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue