canvas-lms/app/models/canvas_metadatum.rb

57 lines
2.2 KiB
Ruby

# frozen_string_literal: true
#
# Copyright (C) 2020 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
class CanvasMetadatum < ActiveRecord::Base
class MetadataArgumentError < ArgumentError; end
# The Metadatum class is intended to be a place for storing
# bits of state the are not really part of the canvas data itself.
# An example of a good usecase would be processing state
# for internal delayed operations (see AssetUserAccessLog).
#
# Although "Setting" or config information could be
# stored in the table, this isn't very heavily cached
# (intentionally, because the current use case is wanting
# current read-and-write operations keep state for a logical
# process).
#
# If you want to store something in here that is going to be
# read-heavy, consider adding a caching path like what's in the
# Setting class and allowing consumers to specify whether they want
# it or not.
self.table_name = "canvas_metadata"
def self.get(key, default={})
raise MetadataArgumentError, "default payload should be a hash: #{default}" unless default.is_a?(Hash)
object = CanvasMetadatum.where(key: key).take
(object&.payload || default).with_indifferent_access
end
# this payload will be stored as a jsonb document,
# so it expects you're passing it a hash. If we
# have other usecases later we can relax the requirement,
# but let's be strict as long as this is precisely what
# we expect.
def self.set(key, payload)
raise MetadataArgumentError, "payload should be a hash: #{payload}" unless payload.is_a?(Hash)
object = CanvasMetadatum.find_or_initialize_by(key: key)
object.payload = payload
object.save!
end
end