Initial data model draft

interface User {
  id: string
	username: string
  email: string  
	verifiedEmail: boolean
  firstName: string
	lastName: string
	image: string
  services: [string] // Service slug ids
  skills: [string] // Skill slug ids
	onlineAccounts [ // JSON instead of another table
		{
			type: string // account slug, e.g. twitter, github
			url: string
		}
	]
	roleStakepoolOperator: boolean
	roleCommunityAdvisor: boolean
  lookingToCollaborateOnProposals: boolean
	createdAt: string
	updatedAt: string
}

interface Skill {
	id: string
	name: string
}

interface Service {
	id: string
	name: string
}

interface Category {
	id: string
	name: string
}

interface SkillCategory {
	skill: string // Skill slug id
	category: string // Category slug id
}

interface ServiceCategory {
	service: string // Service slug id
	category: string // Category slug id
}

interface Tag {
	id: string
	name: string
}

interface Group {
	id: string
	name: string
}

interface TagGroup {
	group: string
	tag: string
}

interface Project {
	id: string
	name: string
	description: string
	onlineAccounts [ // JSON instead of another table
		{
			type: string
			url: string
		}
	]
	tags: [string] // Tag slug ids
	owner: string // User id
	members: [string] // User ids
	createdAt: string
	updatedAt: string
}

interface Currency {
	code: string
  name: string
	symbol: string
}

enum ProposalStatus {
	PENDING
	FUNDED
	ARCHIVED
}

interface Proposal {
  // Data newly added to proposals to be made available on the API
  id: string
  fundCategoryId: string // id for FundCategory data model
  tags: [string] // Link to Tag slug ids
  currency: string // Currency code such as ADA or USD
	status: string // Enum values such as PENDING, FUNDED, ARCHIVED

  // Data extracted from Ideascale
  title: string
  problemDescription: string
  solutionDescription: string
  relevantExperience: string
  outcomeObjectives: string
  description: string
  url: string
  createdAt: string
  requestedAmount: number
  ideascaleId: number
  ideascaleUrl: string
  ideascale: {
    stage: string
    ideaNumber: number
    author: string
    commentsTotal: number
    annotations: string
    attachmentLinks: string
    requestedAmountText: string
  }
}

interface FundRound {
  id: string
  name: string // e.g. Fund 3
}

interface FundCategory {
	id: string
	fundRoundId: number
	name: string
	fundingAmount: number
	currency: string
}

Static data

To keep some parts simple some data may not be stored in a database for the short term

Notes