Created validation schema maps and keyword lists for database insertions
This commit is contained in:
		
							
								
								
									
										381
									
								
								lib/sukaato/vschemas.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										381
									
								
								lib/sukaato/vschemas.ex
									
									
									
									
									
										Normal 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
 | 
			
		||||
		Reference in New Issue
	
	Block a user