import redis import uuid DEFAULT_EXPIRE_TIME = 300 EXPIRE_REFRESH_TIME = 60 redis_connection = redis.Redis(host='localhost', port=6379, decode_responses=True) #################################################################################### # - PERSONS - # #################################################################################### def getPersonId(person_name, person_role): query = f"@name:{person_name} @role:{person_role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) if results[0] > 0: person_key = results[1] return person_key return False def getPerson(person_id): return redis_connection.hgetall(f"person:{person_id}") def register_redis(name, role): query = f"@name:{name} @role:{role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) # First element = number of results if results[0] > 0: return False person_key = f"person:{get_uuid4()}" redis_connection.hset(person_key, mapping={ 'name': name, 'role': role }) return redis_connection.hgetall(person_key) def login_redis(name, role): query = f"@name:{name} @role:{role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) # First element = number of results if results[0] > 0: person_key = results[1] return redis_connection.hgetall(person_key) return False #################################################################################### # - COURSES - # #################################################################################### def isExpired(course_id): ttl = redis_connection.ttl(f"course:{course_id}") if ttl == -2 or ttl == 0: # If -1, the key has no expiration return True return False def isCourseFull(course): students = course.get('students', '') # Because it crashes with ['students'], we have to put a default value: '' here if not students: return False try: places = int(course['places']) if len(students.split(',')) >= places: return True return False except: return False def getCourseId2(course_title, course_teacher): query = f"@title:{course_title} @teacher:{course_teacher}" results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', query) if results[0] > 0: course_key = results[1] return course_key return False def getCourseId(course): return getCourseId2(course['title'], course['teacher']) def getCourse(course_id): return redis_connection.hgetall(f"course:{course_id}") def delete_course(course_id): course = redis_connection.hgetall(f"course:{course_id}") if not course: return False redis_connection.delete(f"course:{course_id}") return True def create_course(course_title, course_summary, course_level, course_places, course_teacher): course_id = get_uuid4() redis_connection.hset(f"course:{course_id}", mapping={ "title": course_title, "summary": course_summary, "level": course_level, "places": course_places, "teacher": course_teacher }) redis_connection.expire(f"course:{course_id}", DEFAULT_EXPIRE_TIME) def update_course(course_id, course_title, course_summary, course_level, course_places, course_teacher): redis_connection.hset(f"course:{course_id}", mapping={ "title": course_title, "summary": course_summary, "level": course_level, "places": course_places, "teacher": course_teacher }) redis_connection.expire(f"course:{course_id}", DEFAULT_EXPIRE_TIME) publish(course_id, f"UPDATE: Course:{course_id} is now: Title: {course_title}, Summary: {course_summary}, Level: {course_level}, Places: {course_places}, Teacher: {course_teacher}") def course_register(course_id, person_id): course = redis_connection.hgetall(f"course:{course_id}") person = redis_connection.hgetall(f"person:{person_id}") if not course or not person: return False students = course.get('students', '') if person_id in students.split(','): return True try: places = int(course['places']) if students != '': students_nb = len(students.split(',')) if students_nb and students_nb >= places: return False except: return False if not students: new_students = person_id else: new_students = students + "," + person_id redis_connection.hset(f"course:{course_id}", "students", new_students) return True def course_unregister(course_id, person_id): course = redis_connection.hgetall(f"course:{course_id}") person = redis_connection.hgetall(f"person:{person_id}") if not course or not person: return False students = course.get('students', '') if person_id not in students.split(','): return True students_list = students.split(",") if len(students_list) == 1: new_students = "" else: new_students = ",".join([student for student in students_list if student != person_id]) redis_connection.hset(f"course:{course_id}", "students", new_students) return True def refresh_expire(course_id): course = redis_connection.hgetall(f"course:{course_id}") if not course: return False ttl = redis_connection.ttl(f"course:{course_id}") if ttl <= 0: return False redis_connection.expire(f"course:{course_id}", ttl + EXPIRE_REFRESH_TIME) return True #################################################################################### # - LINKS - # #################################################################################### def getCoursesFromPerson(person_id): course_keys = redis_connection.keys(f"course:*") courses = [] person = redis_connection.hgetall(f"person:{person_id}") for key in course_keys: course_data = redis_connection.hgetall(key) if person['role'] == "Student": if person_id in course_data.get('students', '').split(","): course_id = getCourseId2(course_data['title'], course_data['teacher']) if course_id == False: continue course_data['id'] = course_id.split(":")[1] courses.append(course_data) else: teacher_id = course_data["teacher"] if teacher_id == person_id: course_id = getCourseId2(course_data['title'], course_data['teacher']) if course_id == False: continue course_data['id'] = course_id.split(":")[1] courses.append(course_data) return courses def isPersonRegisteredToCourse(course, person): if not person: return False person_id = getPersonId(person["name"], person["role"]).split(":")[1] if not person_id: return False course_id = getCourseId(course) if not course_id: return False course_keys = redis_connection.keys(f"course:*") for key in course_keys: course_data = redis_connection.hgetall(key) if person['role'] == "Student": if person_id in course_data.get('students', '').split(","): current_course_id = getCourseId2(course_data['title'], course_data['teacher']) if current_course_id == False: continue if course_id == current_course_id: return True return False #################################################################################### # - UTILS - # #################################################################################### def get_uuid4(): return str(uuid.uuid4()).replace('-', '') def publish(course_id, message): redis_connection.publish(course_id, message)