diff --git a/lib/sukaato/vschemas.ex b/lib/sukaato/vschemas.ex new file mode 100644 index 0000000..f224935 --- /dev/null +++ b/lib/sukaato/vschemas.ex @@ -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