Created validation schema maps and keyword lists for database insertions

This commit is contained in:
Alex Tavarez
2025-07-25 11:25:34 -04:00
parent da025dedfa
commit addfac25f7

381
lib/sukaato/vschemas.ex Normal file
View File

@@ -0,0 +1,381 @@
defmodule Sukaato.Vschemas do
# import Validate
@affil_vschema [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
affil_name: [required: false, type: :string],
affil_uri: [required: true, type: :string],
affil_icon: [required: true, type: :string],
affil_target: [required: false, type: :string, in: [
"_blank",
"_parent",
"_self",
"_top"
]
]
}
]
]
@perms_vschema [
required: true,
type: :list,
list: [
required: true,
type: :string,
#@TODO create function generating these numbers from first 4 numbers
in: [1, 2, 4, 8, 9, 10, 12, 5, 7, 3, 6, 11, 13, 14, 15]
]
]
@pubkeys_vschema %{
oauth: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
access_token: [required: true, type: :string],
auth_code: [required: false, type: :string],
refresh_token: [required: false, type: :string]
}
]
],
fido2: [
required: false,
type: :map,
map: %{
u2f: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
name: [required: true, type: :string],
credential: [required: true, type: :string]
}
]
],
}
],
totp_secret: [required: false, type: :string]
}
@resume_vschema %{
"basics" => [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"label" => [required: true, type: :string],
"image" => [required: false, type: :string],
"email" => [required: true, type: :string],
"phone" => [required: false, type: :string],
"url" => [required: false, type: :string],
"summary" => [required: true, type: :string],
"location" => [
required: false,
type: :map,
map: %{
"address" => [required: true, type: :string],
"postalCode" => [required: true, type: :string],
"city" => [required: true, type: :string],
"countryCode" => [required: true, type: :string],
"region" => [required: true, type: :string]
}
],
"profiles" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"network" => [required: true, type: :string],
"username" => [required: false, type: :string],
"url" => [required: true, type: :string]
}
]
]
}
],
"work" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"position" => [required: true, type: :string],
"url" => [required: false, type: :string],
"startDate" => [required: true, type: :string],
"endDate" => [required: false, type: :string],
"summary" => [required: true, type: :string],
"highlights" => [
required: false,
type: :list,
list: [
required: true,
type: :string
]
]
}
]
],
"volunteer" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"organization" => [required: true, type: :string],
"position" => [required: true, type: :string],
"url" => [required: false, type: :string],
"startDate" => [required: true, type: :string],
"endDate" => [required: false, type: :string],
"summary" => [required: true, type: :string],
"highlights" => [
required: false,
type: :list,
list: [
required: true,
type: :string
]
]
}
]
],
"education" => [
required: true,
type: :list,
list: [
required: true,
type: :map,
map: %{
"institution" => [required: true, type: :string],
"url" => [required: false, type: :string],
"area" => [required: true, type: :string],
"studyType" => [required: true, type: :string],
"startDate" => [required: true, type: :string],
"endDate" => [required: false, type: :string],
"score" => [required: false, type: :number],
"courses" => [
required: false,
type: :list,
list: [
required: true,
type: :string
]
]
}
]
],
"awards" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"title" => [required: true, type: :string],
"date" => [required: false, type: :string],
"awarder" => [required: false, type: :string],
"summary" => [required: true, type: :string]
}
]
],
"certificates" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"date" => [required: false, type: :string],
"issuer" => [required: true, type: :string],
"url" => [required: false, type: :string]
}
]
],
"publications" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"publisher" => [required: true, type: :string],
"releaseDate" => [required: true, type: :string],
"url" => [required: false, type: :string],
"summary" => [required: false, type: :string]
}
]
],
"skills" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"level" => [required: true, type: :string],
"keywords" => [
required: true,
type: :list,
list: [
required: true,
type: :string
]
]
}
]
],
"languages" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"language" => [required: true, type: :string],
"fluency" => [required: false, type: :string]
}
]
],
"interests" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"keywords" => [
required: false,
type: :list,
list: [
required: true,
type: :string
]
]
}
]
],
"references" => [
required: true,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"reference" => [required: true, type: :string]
}
]
],
"projects" => [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
"name" => [required: true, type: :string],
"startDate" => [required: true, type: :string],
"endDate" => [required: false, type: :string],
"description" => [required: true, type: :string],
"highlights" => [
required: false,
type: :list,
list: [
required: true,
type: :string
]
],
"url" => [required: false, type: :string]
}
]
]
}
#@TODO finish 'showcase' 'folio' database field validation schema
@showcase_vschema %{
audio: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
uri_scheme: [required: false, type: :string],
uri: [required: true, type: :string],
query: [required: false, type: :string]
}
]
],
video: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
uri_scheme: [required: false, type: :string],
uri: [required: true, type: :string],
query: [required: false, type: :string]
}
]
],
text: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
uri_scheme: [required: false, type: :string],
uri: [required: true, type: :string],
query: [required: false, type: :string]
}
]
],
intrct: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
uri_scheme: [required: false, type: :string],
uri: [required: true, type: :string],
query: [required: false, type: :string]
}
]
],
dev: [
required: false,
type: :list,
list: [
required: true,
type: :map,
map: %{
uri_scheme: [required: false, type: :string],
uri: [required: true, type: :string],
query: [required: false, type: :string]
}
]
]
}
end